我在 Ubuntu 12.04 的控制台中创建了一个 cron 作业,使用以下命令crontab -e
:
10 09 * * * /home/ram-pc/Desktop/bala/personal/dump.sh
但它没有运行。当我保存时,它安装正确且没有错误,然后当我使用它查看它时,crontab -l
它显示了我的 crontab,但它没有及时运行。
我的dump.sh
包含备份数据库命令,如果我尝试单独运行,该.sh
文件即可正确运行。
谁能告诉我问题出在哪里?
代码内容dump.sh
为:
cd
cd Desktop/bala/personal
mkdir $(date +%Y%m%d)
cd $(date +%Y%m%d)
mysqldump -u root -p*** --all-databases |gzip -9 >database-$(date +%Y%m%d).sql.gz
答案1
这是你的 cron 作业,它看起来很好:
10 09 * * * /home/ram-pc/Desktop/bala/personal/dump.sh
设置为每天上午 9:10 触发。但查看您的脚本时发现问题:
cd
cd Desktop/bala/personal
mkdir $(date +%Y%m%d)
cd $(date +%Y%m%d)
mysqldump -u root -p*** --all-databases |gzip -9 >database-$(date +%Y%m%d).sql.gz
当 cron 任务运行时,它不会以你(用户)的身份运行,因此不会加载二进制文件的路径。因此脚本不知道它在哪里mysqldump
。因此你应该运行which
弄清楚完整路径是这样的:
which mysqldump
输出应该是这样的;这里使用一个通用的例子:
/usr/local/bin/mysqldump
此外,您还应在文件的第一行添加脚本名称,以便 shell 知道应在哪个环境中运行它。此外,cd
后面的 和cd Desktop/bala/personal
可以简化为cd ~/Desktop/bala/personal
。因此,整个新脚本将如下所示:
#!/usr/bin/env bash
cd ~/Desktop/bala/personal
mkdir $(date +%Y%m%d)
cd $(date +%Y%m%d)
/usr/local/bin/mysqldump -u root -p*** --all-databases |gzip -9 >database-$(date +%Y%m%d).sql.gz
尝试自己从命令行运行该程序,看看它是否有效。如果有效,请再次从 cron 运行它。
答案2
按照如下方式设置 cron 作业,以便您在执行脚本时捕获错误以及您的用户名,例如:charm_quark
10 09 * * * charm_quark /home/ram-pc/Desktop/bala/personal/dump.sh >> /home/ram-pc/Desktop/bala/personal/cron.log
还要检查您的权限和环境
在使用自定义脚本之前,请确保它是可执行的,并使用 cron 设置的有限环境变量集对其进行测试。要复制用于运行上述 cron 条目的环境,请使用:
env -i SHELL=/bin/sh PATH=/etc:/bin:/sbin:/usr/bin:/usr/sbin HOME=/home/dru LOGNAME=dru /usr/home/dru/bin/mycustomscript.sh
参考:第 12 章 配置和调优
故障排除步骤
清空 dump.sh 文件,并用一些 echo 替换
#!/usr/bin/env bash echo "this is a test" >> /home/ram-pc/Desktop/bala/personal/test.log
检查.sh文件的权限并进行更改。
chmod 777 /home/ram-pc/Desktop/bala/personal/dump.sh
请更新 crontab 至
* * * * * charm_quark /home/ram-pc/Desktop/bala/personal/dump.sh >> /home/ram-pc/Desktop/bala/personal/cron.log