Bash 脚本未从 crontab 执行

Mat*_*sta 22 mysql bash backup scripts

我有以下 bash 脚本:

#!/bin/bash
mysqldump -u ******** -p********  --all-databases | gzip > /home/srvlinux01/MySQLBackups/database_$(date +\%Y-\%m-\%d).sql.gz
Run Code Online (Sandbox Code Playgroud)

它位于/home/srvlinux01/MySQLBackups/作为backup.sh具有下列权限

-rwxr--r-- 1 root       root           134 feb 27 12:48 backup.sh
Run Code Online (Sandbox Code Playgroud)

我已经设置了一个 cronjobsudo crontab -e来每天晚上运行它

#Automatic MySQL backup
30 3 * * * sh /home/srvlinux01/MySQLBackups/backup.sh
Run Code Online (Sandbox Code Playgroud)

但是我收到以下错误的电子邮件:

sh: 0: Can't open /home/srvlinux01/MySQLBackups/backup.sh
Run Code Online (Sandbox Code Playgroud)

我一直在尝试不同的设置,但无法弄清楚出了什么问题。我可以手动运行脚本,一切都很顺利,所以我猜我的 cronjob 条目有问题,但无法真正理解是什么。你能帮我弄清楚吗?谢谢!

don*_*oey 19

你需要给你的 cron 一个PATH. 例如:

SHELL=/bin/sh PATH=/bin:/sbin:/usr/bin:/usr/sbin 
Run Code Online (Sandbox Code Playgroud)

在你的情况下,试着把它放在你的命令之前。查看此问题中的社区 wiki,了解有关为什么PATH需要该变量的更多信息。这是摘录;本质上,这个想法是 cron 不读取/etc/environment

一个常见的“问题”是 PATH 环境变量不同。也许您的 cron 脚本使用了在 中somecommand找到的命令/opt/someApp/bin,您已将其添加到PATH/etc/environment?cron 不读取该文件,因此somecommand在使用 cron运行时从脚本运行将失败,但在终端中运行时可以工作。要解决这个问题,只需PATH在脚本顶部设置您自己的变量即可。


小智 9

chmod +x /home/srvlinux01/MySQLBackups/backup.sh             
Run Code Online (Sandbox Code Playgroud)

尝试在命令行上使用完整路径运行脚本:

/home/srvlinux01/MySQLBackups/backup.sh
Run Code Online (Sandbox Code Playgroud)

如果它没有运行 - 有问题(路径错误)

确保这是您的 crontab

crontab -e 
Run Code Online (Sandbox Code Playgroud)

没有须藤:

sudo crontab -e
Run Code Online (Sandbox Code Playgroud)

是 root crontab - 并且 root 无法找到您的脚本;)

在 crontab 中删除“sh”只需写:

30 3 * * * /home/srvlinux01/MySQLBackups/backup.sh
Run Code Online (Sandbox Code Playgroud)


小智 8

我可以在您的 crontab 文件配置中看到一个错误。在下面的配置中,您尝试调用backup.sh与在 shell 提示符中相同的sh前缀,这在 cron 中可能不起作用。

#Automatic MySQL backup
30 3 * * * sh /home/srvlinux01/MySQLBackups/backup.sh
Run Code Online (Sandbox Code Playgroud) 解决方案:
  1. 如果需要,请按照评论中的说明更改所有者。
  2. 使其成为可执行文件。
    chmod a+x <文件名>
  3. 更新您的 crontab 以反映这一点。(直接调用文件,根据文件内的shebang行使用shell)

    #Automatic MySQL backup
    30 3 * * * /home/srvlinux01/MySQLBackups/backup.sh
    
    Run Code Online (Sandbox Code Playgroud)

我希望这会有所帮助。