crontab PATH変数を設定する方法


17

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変数を設定するにはどうすればよいですか?またはより良い-それにパスを追加する方法?

回答:


17

それらは似ていますが、ユーザー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 = / sbin:$ PATHなどが機能しないため、編集することはできません。試した...
csny

はい、このようなケースではゼロからPATHを定義する必要があります。これは、crontabで実行されるすべてのコマンドを知っているので、それらを考慮するだけで十分簡単に​​なるはずです。
豆14

しゅう bash -lcはません。現時点ではPATHを手動で設定するのは得意ですが、スクリプトをインストールする場合は、フルパスを指定せずにcronjobで認識されるようにします。私はそれが何らかの形で可能だと確信しておりbash -lc、解決策に向かっています:)
csny 14

4
bash -lcは、ユーザーのプロファイルを取得するログインシェルを起動します。これは、〜/ .bash_profile、〜/ .profile、または〜/ .bashrcに設定されたPATHを使用することを意味します...そこにパスが設定されていますか?もしそうなら、それはうまく機能しません。それに対する私の答えを更新します
madumlao

すごい。マダンラオに感謝します。binファイルフォルダーを〜/ .bash_profileに手動で追加した後、cronjobは正常に機能します。
张健健

8

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

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

3

cronjob行または1行でPATH(または他のパラメーター)を設定することができます。ただし、のようなシェル拡張を使用することはできません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

0

同じ問題があり、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

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

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.