Linux

為什麼我的備份腳本在執行時有效,但在通過 cron 執行時無效?

  • May 15, 2011

這是我的劇本,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 中。

引用自:https://serverfault.com/questions/269977