cronで実行するとシェルスクリプトが失敗する

cronで実行するとシェルスクリプトが失敗する

誰でも私を助けることができますか?何時間も問題で苦労していますが、解決できないようです。

シェルを介してこのスクリプトを実行すると機能し、私に送信された正しい電子メール出力も受け取りますが、cronjobを介して実行すると常にバックアップ失敗メッセージが表示されますが、これは正しくなく手動で動作します。

#dokuwiki related
dokudate1=$(date +"%d.%m.%y - %H.%M")
host=$(hostname)
dokudate=$(date +"%m-%d")
dokufunc=$(find|grep "dokuwiki"|grep "$dokudate" > doku.txt)

#tw related
twdate1=$(date +"%d.%m.%y - %H.%M")
host=$(hostname)
twdate=$(date +"%d.%m")
twfunc=$(find|grep "torzon"|grep "$twdate" > tw.txt)

fc1(){
$dokufunc
if
grep -R "dokuwiki" doku.txt > /dev/null
then
echo "..."
echo "dokuwiki backup successfull"
echo -en "dokuwiki backup success!" | mail -s "dokuwiki backup check successfull!" mymail.com
rm doku.txt
else
echo "dokuwiki backup fail"
echo -e "dokuwiki backup fail!" | mail -s "dokuwiki backup check failure!" mymail.com
fi
}


fc2(){
$twfunc
if
grep -R "torzon" tw.txt > /dev/null
then
echo "..."
echo "torzon backup successfull"
echo -en "torzon backup success!" | mail -s "torzon backup check successfull!" mymail.com
rm tw.txt
else
echo "torzon backup fail"
echo -e "torzon backup fail!" | mail -s "torzon backup check failure!" mymail.com
fi
}

fc1

fc2

echo "done"

ありがとうございます!

答え1

どのディストリビューションを使用しているかはわかりませんが、cronスクリプトは通常、インタラクティブシェルよりも「クール」ではない最小シェルを使用して実行されます。これは完全なスクリプトですか?もしそうならシェルボーン適切なコンテキストをロードします。

また、組み込みのシェルコマンド以外の操作に完全修飾パスを使用するのにも役立ちます。たとえば、findに配置できます/usr/bin/find。次のwhichコマンドを使用して、これらの問題を解決できます。

[me@host ~]$ which find
/usr/bin/find

最終的にDopeGhotiが提案したように、cronスクリプトの出力をどこかに記録する必要があります(stdoutとstderrをキャプチャ)。例えば、

  0 23 * * * /home/user/backup_script.sh >> /var/log/backup.log 2>&1

関連情報