データベースをダンプし、SQLファイルをSwiftにアップロードするスクリプトがあります。端末ではうまく動作しますが、cronでは失敗するスクリプトに問題があります。
/usr/local/bin/swift
デバッグ後、スクリプトがそのコマンドを見つけることができないことがわかりました。
これは私のcrontabエントリです。
*/2 * * * * . /etc/profile; bash /var/lib/postgresql/scripts/backup
私が試したことは次のとおりです。
swift
次のフルパスを使用してください。/usr/local/bin/swift
/etc/profile
bashスクリプトを実行する前にスクリプトを実行してください。
この問題をどのように解決できますか?
答え1
Cronはユーザーと同じ環境では実行されません。次のようにすると、何を意味するのかがわかります。
ターミナルプロンプトに入力env
し、出力を書き留めます。
次に、このようなクローンジョブを設定し、その出力を前のジョブと比較します。
*/5 * * * * env > ~/output.txt
ユーザーと同じ変数がcrontab
ないため、問題が発生する可能性が最も高いことがわかります。PATH
解決策として、(postgresユーザーから)echo $PATH
結果をcrontabの最初の行にコピーできます(このようなもの)。
PATH=/usr/local/bin:/bin:/usr/bin:/usr/local/sbin:/usr/sbin:/home/jbutryn/.local/bin:/home/jbutryn/bin
または、より具体的に説明したい場合は、以下を追加するだけです。
PATH=$PATH:/usr/local/bin
しかし、私は通常これを行うべきではない理由を聞いていません。そうしないと、この問題が再び発生する可能性があるため、常にユーザーのPATHをcrontabに入れます。
答え2
最も一般的なことをしました。スケジュールされたジョブエラー。特定の環境を使用している場合は、$ PATHにパスを追加してください。
# User specific environment and startup programs
PATH=$PATH:$HOME/bin:/usr/sbin:/usr/bin:/script
export PATH
また、cronログ(/var/log/cronまたは/var/log/syslog)を確認してください。そして、バイナリに対するユーザーの権限を確認してください。