Linux
為什麼我的備份腳本在執行時有效,但在通過 cron 執行時無效?
這是我的劇本,
backup_mongo.sh
#!/bin/bash suffix=$(date +%w) rm /home/myuser/backup/mongo-$suffix -rf mkdir /home/myuser/backup/mongo-$suffix mongodump -h$1 -u$2 -p$3 -dmydb -o/home/myuser/backup/mongo-$suffix
在我的
crontab -e
:0 3 * * * /bin/bash /home/myuser/myproject/production/backup_mongo.sh localhost user1 pass1
當我正常執行腳本(執行上面的命令)時,腳本工作並且目錄“mydb”在/mongo-$suffix中創建。
但是,當我把它放在 crontab 中時,/mongo- $ suffix gets created but the “mydb” directory does not exist. There’s nothing in /mongo- $ 後綴。
你可能沒有
mongodump
在你的PATH
. 嘗試使用mongodump
命令的絕對路徑。
這很可能是 PATH 問題,但我建議不要在 crontab 中覆蓋 PATH,因為它是
- 真的很容易避免這種行為
- 可能存在安全風險
其良好的 bash/sh 編碼風格可以定義您想要觸發的每個二進製文件,並將其完整路徑作為變數
!#/bin/bash RSYNC="/usr/bin/rsync"
並稍後參考該變數。
$RSYNC /foo/bar baz
還有一些選項可以更改正在執行 crontab 的使用者。假設有一個名為 mongodump 的使用者定義了一個包含 mongodump 的 PATH,您可以成為該使用者並編輯它的 crontab。或者你也可以使用
/bin/bash /bin/su - mongodump -c /bin/bash /home/myuser/myproject/production/backup_mongo.sh
在根的 crontab 中。