Cron:我的 crontab 似乎根本没有做任何事情

Cron:我的 crontab 似乎根本没有做任何事情

我想我错过了一些东西。我已经在办公室设置了一些 crontab 来通过 ssh 处理 rsync,以处理一些备份,但就此而言,它们似乎没有运行或日志记录。我错过了什么吗?

这是我的 crontab:

0 2 * * * idealm /usr/bin/local/rsync -avz --rsync-path=/usr/bin/rsync -e ssh /Ideal\ Machinery\ Database/* [email protected]:~/db_backup >> /home/idealm/Work/cron_log.txt

^ 从 Mac Mini 服务器到 SME 服务器

0 2 * * * i /usr/bin/rsync -avz --rsync-path=/usr/local/bin/rsync -e ssh /home/e-smith/files/ibays/drive-i/files/Warehouse\ Pics/Converted\ Warehouse\ Pictures/* [email protected]:/ideal_img >> /home/i/cron_log.txt

^ 从 SME 服务器到 Mac Mini 服务器

0 2 * * * i /usr/bin/rsync -rvz -e ssh /home/e-smith/files/ibays/drive-i/files/Warehouse\ Pics/* fm-backup@[remote server]:/home/fm-backup/img_all/ >> /home/i/cron_log.txt

0 2 * * * i /usr/bin/rsync -rvz -e ssh ~/db_backup/* fm-backup@[remote server]:~/db_backup/ >> /home/i/cron_log.txt

^ 从 SME 服务器到运行 Ubuntu 10.10 的远程服务器(其中 [远程服务器] 是审查地址)

问题是,当我从 bash 运行这些作业时,一切都运行良好 - cron 似乎不起作用。有什么建议么?

答案1

首先尝试一些简单的 cronjobs 并从这里构建:

0 12 * * * user echo 'Hello, World!' >> /tmp/test.log 2>&1
1 12 * * * user ssh anotheruser@anotherhost ls >> /tmp/test.log 2>&1
2 12 * * * user rsync -e ssh anotheruser@anotherhost:/path/to/small/dir /tmp/test-dir >> /tmp/test.log 2>&1

一开始避免使用太多选项,但使用2>&1对于获取任何错误消息很重要。您还可以使用2>/tmp/test-error.log将它们发送到单独的文件。通常,当且仅当有任何输出时,cron 才会生成电子邮件。该邮件被发送到 crontab 中设置的 MAILTO 环境变量中提到的电子邮件地址,或者发送到本地 unix 用户,作业的运行就像未设置 MAILTO 一样。如果您没有安装邮件服务器或不确定如何访问它,那么您可以将所有输出重定向到文件。另一件需要注意的事情是设置 SHELL。默认情况下,cron 使用 /bin/sh 这通常就很好,甚至可能是某些系统上 /bin/bash 的符号链接,但如果不是,并且您希望在命令中使用 bash-isms,您可以添加SHELL=/bin/bash或其他适用于您的职位列表之前。

我在上面的 crontab 中看到的另一个问题是空格。由于这些命令在普通 shell 中工作,因此这可能不是问题,但在使用某些远程 ssh 命令时请务必小心使用空格,例如:ssh server ls "Music Videos",此类命令中的空格需要双重转义,因为本地 shell 和远程 shell 可以解释它们。正确的命令应该是这样的:ssh server ls "Music\\ Videos"或者ssh server ls '"Music Videos"'

我能想到的最后一件事是 ssh 身份验证失败。我假设您正在使用公钥身份验证。您的公钥存储在哪里?它是~/.ssh/id_rsa作为未加密的私钥,还是将其加载到 SSH 公钥代理中?如果由于磁盘上的副本已加密而将其加载到代理中,则需要确保在 crontab 中手动设置 SSH_AUTH_SOCK 以指向 rsync 时将运行的代理。我通常将私钥加密保存在磁盘上,并使用固定的套接字路径在后台运行 ssh-agent。例如,我运行ssh-agent -a /tmp/user.agent后将SSH_AUTH_SOCK=/tmp/user.agent ssh-add .ssh/id_rsa私钥加载到代理中。我在每次重新启动后手动运行的脚本中都有这两个命令,因为我需要输入密码来解锁私钥。然后我SSH_AUTH_SOCK=/tmp/user.agent在我的 crontab 文件中供我的自动 cronjobs 使用。

相关内容