在我的 crontab 文件(sudo crontab -e
)中我有以下命令:
*/1 * * * * wget -q -O /dev/null http://help.mysite.com/inc/mail/hesk_pop3.php
0 7 * * * bash -c "/home/backup/backupscript.sh"
第一行执行并正常工作,但第二行由于某种原因不起作用。但是,如果我通过终端 ( ./backupscript.sh
) 运行脚本,它会正确运行。
backupscript.sh 文件的所有者是 root:root,并且具有 755 权限。
该文件中有以下代码:
#!/bin/bash
/usr/bin/mysqldump -u root -wordpresspassword wordpressusername | /bin/gzip > /home/backup/mysql/wordpress_`date +%m-%d-%Y_%T`.sql.gz
/usr/bin/mysqldump -u root -heskpassword heskusername | /bin/gzip > /home/backup/mysql/hesk_`date +%m-%d-%Y_%T`.sql.gz
/bin/tar cvzf /home/backup/wordpress/wordpress_`date +%m-%d-%Y_%T`.tar.gz /var/www/wordpress/
/bin/tar cvzf /home/backup/hesk/hesk_`date +%m-%d-%Y_%T`.tar.gz /var/www/hesk/
/usr/bin/s3cmd sync -r -P /home/backup/ s3://backups.mysite/
find /home/backup/ -mtime +7 -type f -exec rm {} \;
该脚本基本上备份我们的 MySQL 数据库并压缩它们,备份我们的 apache 站点并压缩它们,将这些文件复制到 Amazon S3,然后在服务器上执行清理。
我在这里遗漏了什么?我尝试了很多方法,比如从 bash 切换到 shell,但都没有任何效果。
答案1
一个解决方法是使用 shell 脚本来执行此操作:
for (( ; ;))
do
sleep 86400
wget -q -O http://help.mysite.com/inc/mail/hesk_pop3.php
/bin/sh /home/backup/backupscript.sh
done
在上面的脚本中,我使用了sleep 86400
(相当于一天的秒数)。您可以相应地配置间隔。
如果您想通过使用 ssh 登录在某些服务器/桌面上运行,那么请将此脚本作为后台进程启动/运行。
答案2
调试 crontab 的一般技巧:
- 捕获输出。
- 将其重定向到文件,例如
{ command1; command2; } &>/tmp/joboutput
[email protected]
或者通过在 crontab 中设置确保 crond 将输出作为电子邮件发送到您的邮箱。
- 将其重定向到文件,例如
- crontab 调用的进程的 shell 环境与在终端中启动相同进程的环境不同。
确保在 crontab 中指定了所有必要的环境变量。 - %在 crontab 中具有特殊含义(请仔细阅读
man 5 crontab
:-)该行的整个命令部分(直到换行符或 % 字符)将由 /bin/sh 或 crontab 文件的 SHELL 变量中指定的 shell 执行。除非使用反斜杠 () 进行转义,否则命令中的百分号 (%) 将更改为换行符,并且第一个 % 之后的所有数据将作为标准输入发送到命令。无法将单个命令行拆分为多行,就像 shell 的尾随“\”一样。