データベースをダンプしてSQLファイルをSwiftにアップロードするスクリプトがあります。スクリプトがターミナルで正常に実行されるがcronで失敗する問題に遭遇しました。
少しデバッグしたところ、/usr/local/bin/Swift
コマンドがスクリプト内に見つからないことがわかりました。
これが私のcrontabエントリです。
*/2 * * * * . /etc/profile; bash /var/lib/postgresql/scripts/backup
これが私が試したものです:
Swift
へのフルパスを/usr/local/bin/Swift
として使用/etc/profile
スクリプトを実行します。どうすればこれを解決できますか?
Cronはユーザーと同じ環境では実行されません。次の操作を行うと、私の意味がわかります。
端末プロンプトからenv
と入力し、出力を書き留めます。
次に、次のようにcronジョブを設定し、その出力を以前のものと比較します。
*/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に入れます。これを行わない理由はまだ聞いていないためです。そうしないと、この問題が再び発生する可能性があります。
最もよくある cronの間違い の1つを作成しました。特定の環境を使用している場合は、$ 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)も確認してください。バイナリファイルに対するユーザーの権限を確認してください。