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変数を設定するにはどうすればよいですか?それ以上-パスを追加する方法は?
ユーザー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または他の環境変数を特別なものに設定した場合、それもコマンドに含まれます。
デフォルトのシステム全体のPATHおよびその他のENV変数(/etc/profile.dで定義されている)が必要な場合は、次のように入力します。
* * * * * . /etc/profile; your cmd
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
同じ問題があり、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
(再起動するたびに実行するようにプログラムを設定しました)