Ubuntu 12.04 无法使用我的某个 crontab 命令...有什么想法吗?

Ubuntu 12.04 无法使用我的某个 crontab 命令...有什么想法吗?

在我的 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 的一般技巧:

  1. 捕获输出。
    • 将其重定向到文件,例如{ command1; command2; } &>/tmp/joboutput
    • [email protected]或者通过在 crontab 中设置确保 crond 将输出作为电子邮件发送到您的邮箱。
  2. crontab 调用的进程的 shell 环境与在终端中启动相同进程的环境不同。
    确保在 crontab 中指定了所有必要的环境变量。
  3. 在 crontab 中具有特殊含义(请仔细阅读man 5 crontab:-)

    该行的整个命令部分(直到换行符或 % 字符)将由 /bin/sh 或 crontab 文件的 SHELL 变量中指定的 shell 执行。除非使用反斜杠 () 进行转义,否则命令中的百分号 (%) 将更改为换行符,并且第一个 % 之后的所有数据将作为标准输入发送到命令。无法将单个命令行拆分为多行,就像 shell 的尾随“\”一样。

相关内容