web-dev-qa-db-ja.com

cronのスクリプトでコマンドが見つかりません

データベースをダンプしてSQLファイルをSwiftにアップロードするスクリプトがあります。スクリプトがターミナルで正常に実行されるがcronで失敗する問題に遭遇しました。

少しデバッグしたところ、/usr/local/bin/Swiftコマンドがスクリプト内に見つからないことがわかりました。

これが私のcrontabエントリです。

*/2 * * * * . /etc/profile; bash /var/lib/postgresql/scripts/backup  

これが私が試したものです:

  1. Swiftへのフルパスを/usr/local/bin/Swiftとして使用
  2. Bashスクリプトを実行する前に/etc/profileスクリプトを実行します。

どうすればこれを解決できますか?

5
Little Child

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に入れます。これを行わない理由はまだ聞いていないためです。そうしないと、この問題が再び発生する可能性があります。

8
jesse_b

最もよくある 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)も確認してください。バイナリファイルに対するユーザーの権限を確認してください。

0
Quarind