web-dev-qa-db-ja.com

crontab PATH変数を設定する方法

Crontabからスクリプトを実行するときに問題が発生しました。調査の結果、PATHパラメータに/ sbinが含まれていないことが問題であることがわかりました。

私はそれが/ etc/crontabに何を含んでいるかを調べました:

PATH=/sbin:/bin:/usr/sbin:/usr/bin

テストとして-PATH変数を出力する単純なcronジョブ:

* * * * * echo $PATH &> /root/TMP.log

出力は次のとおりです。

cat /root/TMP.log
/usr/bin:/bin

この動作を理解できません... PATH変数を設定するにはどうすればよいですか?それ以上-パスを追加する方法は?

22
csny

ユーザーcrontab(crontab -eを使用して編集)は類似していますが、システムcrontab(/ etc/crontabを編集して編集)とは別のパスを保持します。

システムのcrontabには7つのフィールドがあり、コマンドの前にユーザー名を挿入します。一方、ユーザーcrontabには6つのフィールドしかなく、時間フィールドの直後に直接コマンドに移動します。

同様に、システムのcrontabのPATHには通常/ sbinディレクトリが含まれますが、ユーザーのcrontabのPATHには含まれません。ユーザーcrontabにPATHを設定する場合は、ユーザーcrontabでPATH変数を定義する必要があります。


Cronのシェルコマンドで通常のPATHを追加する簡単な回避策は、ログインシェルでbashを実行して、cronjobにプロファイルを提供させることです。たとえばの代わりに

* * * * * some command

代わりに実行できます

* * * * * bash -lc some command

このように、プロファイルがPATHまたは他の環境変数を特別なものに設定した場合、それもコマンドに含まれます。

22
madumlao

デフォルトのシステム全体のPATHおよびその他のENV変数(/etc/profile.dで定義されている)が必要な場合は、次のように入力します。

* * * * * . /etc/profile; your cmd
8

PATH(または他のパラメーター)をcronjob行または単一行で設定することが可能です。ただし、PATH=$PATH:/usr/local/binのようなシェル拡張を使用することはできません。ただし、チルダはホームディレクトリのショートカットに使用できます。

本から:

Crontabのアクティブな行は、環境設定またはcronコマンドのいずれかです。環境設定は次の形式です。name = value等号(=)の周りの空白はオプションであり、value内の後続の先頭以外の空白はnameに割り当てられた値の一部です。値の文字列は、先頭または末尾の空白を保持するために、引用符で囲むことができます(単一または二重ですが、一致します)。

詳細については、man 5 crontabを参照してください。

だからこれはうまくいくはずです:

PATH=/bin:/usr/bin:/my/path/bin
5 3 * * * command_that_requires_my_path
6
itsafire

同じ問題があり、crontabでスクリプトを実行する別の方法を見つけました。プログラムを実行する最も簡単な方法は、プログラムのディレクトリにcdできるスクリプトを作成することだと思います。次に、そのスクリプトでプログラムを呼び出します。

これはスクリプトの例です(スクリプト名= launcher.sh):

#!bin/bash
cd /home/pi/test
Sudo python3 example.py

次に、スクリプトを実行可能にします。

chmod 755 launcher.sh

そして最後に、スクリプトをcrontabに追加します

crontab -e

そしてこの行を最後に追加します:

@reboot sh /home/pi/test/launcher.sh

(再起動するたびに実行するようにプログラムを設定しました)

0
Reyhaneh Trb