Hello everyone!

I’m running a few different services off of my Ubuntu VM on ProxMox, and they’ve all been running great for about 6 months now. However, I’m trying to setup some better backups and such of individual services, and I wrote a bash script to do that for me and delete older backups once I accumulate enough.

All of that works 100% fine. Like absolutely no issues with the script when I run it myself. However, I can not for the life of me get crontab to run it.

If I run sudo ./folder/directory/backup.sh then everything runs perfectly. However, if I setup my crontab with 0 * * * * ./folder/directory/backup.sh I get absolutely nothing.

I have also tried setting the crontab with sudo, sh, sudo sh, and both combinations without the dot in front of the path to the shell script.

Does anyone have any idea what I am doing wrong?

Thank you so much for any help

Update: I have edited /etc/crontab with the following 0 * * * * * root /mnt/nas/freshrss/backups/backup.sh. After waiting for the crontab to fire off, nothing happened. Still not really sure what’s going on.

  • The crontab has no concept of . meaning the current directory. Try with the full path to the script. You might also need a user (but you might not if it’s a user’s crontab as opposed to the system one).

    So if those help and report back either way.

    • nous@programming.dev
      link
      fedilink
      English
      arrow-up
      4
      ·
      2 years ago

      The crontab has no concept of . meaning the current directory.

      Not quite true. . exists in all directories so will work in any application. But it raises the question of what is the directory cron is running in. Probably not what you expect, definitely not your users home dir and you probably should not rely on it. So you should not use relative paths inside it - even if you can get them to work. Best to just stick to absolute paths or explicit cd to the right location before hand (that is on the same cron line or in the script it calls).

    • theRealBassist@lemmy.worldOP
      link
      fedilink
      arrow-up
      2
      ·
      2 years ago

      I have edited /etc/crontab with the following 0 * * * * * root /mnt/nas/freshrss/backups/backup.sh. After waiting for the crontab to fire off, nothing happened.

      • There’s an extra *. There should be 5 time fields, but there’s a zero followed by 5 *s. If that’s not what’s causing it, next spot I’d check is output from the cron logs. Not sure where that is in Ubuntu, though, might be in/var/log/messages or in the systemd journal. Cron sometimes sends mail when there’s an error, too, so checking the users mail might give you some clues as well.

  • Swiggles@lemmy.blahaj.zone
    link
    fedilink
    arrow-up
    2
    ·
    edit-2
    2 years ago

    I know it is not really what is asked, but cron is a pain in the ass to handle and manage. I am not sure if it is officially deprecated yet, but I would migrate everything to systemd timers instead it is so much better. It provides configuration tools and proper integrated logging and troubleshooting tools.

    Just create a service file of type oneshot which runs your backup script and a timer unit with the same base name. Set the timer to hourly, place both files into /etc/systemd/system, do a daemon-reload and enable the timer. You can see the status or journal for output and list-timers to see the schedule and wether or not it ran.

    Usually if programs can run in a user context but don’t work as some automated process it is either due to environment differences. Most importantly PATH which can be solved by using absolute paths for programs. Another very common problem is the systems MAC implantation although it happens more often with SEL. Still you might want to check your AppArmor configuration and (audit) logs.

    If you want to stick with cron also make sure to read the mails (/var/mail/root by default), because most cron implementations dump their output/logs there.

  • DeuxChevaux@lemmy.world
    link
    fedilink
    arrow-up
    2
    ·
    edit-2
    2 years ago

    Thre could be two other things that I can think of:

    Permissions maybe: Try “sudo chmod +x /path/yourscript.sh” to make your script explicitly executable.

    Also, the environment of cron doing something may be different from when you do it as root or user. So you should always use the full path to every command in your script; like “/bin/tar” instead of just “tar”. To find out, where things are, you can use “whereis tar”, and it will tell you, whether it’s in /bin, /usr/bin or elsewhere.

  • leo@feddit.de
    link
    fedilink
    arrow-up
    1
    arrow-down
    2
    ·
    edit-2
    2 years ago

    Cron does not like dots in the filename of your script. Does it work if it is just “backup” instead of “backup.sh”?

    Have a look at the most upvoted comment.