Cron:我的 crontab 似乎根本沒有做任何事情
我想我錯過了一些東西。我已經在我的辦公室設置了一些 crontab 來通過 ssh 處理 rsync 以處理一些備份,但就此而言,它們似乎沒有執行或日誌記錄。我錯過了什麼嗎?
這是我的 crontab:
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 伺服器到 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/* idealm@192.168.0.194:/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 的遠端伺服器(其中
$$ remote server $$是審查地址) 問題是,當我從 bash 執行這些作業時,一切正常 - cron 似乎無法正常工作。有什麼建議?
首先嘗試一些簡單的 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 和遠端外殼可以解釋它們。正確的命令應該是這樣的: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 使用。