Cron:我的 crontab 似乎什么都没做

eck*_*kza 2 ssh cron rsync

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

这是我的 crontabs:

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

^ 从 Mac Mini Server 到 SME Server

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/* idealm@192.168.0.194:/ideal_img >> /home/i/cron_log.txt

^ 从中小企业服务器到 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 似乎无法正常工作。有什么建议?

pen*_*359 5

首先尝试一些简单的 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
Run Code Online (Sandbox Code Playgroud)

一开始避免使用太多选项,但使用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 使用。