web-dev-qa-db-ja.com

cronからshスクリプトを実行する

Test.shスクリプトがあります

#!/bin/sh
php /home/v/file.php
sh /root/x/some.sh

コマンドラインからrootとしてファイルを実行すると機能します。

sh /home/v/test.sh 

crontab -e(ルートcronです)に設定すると、機能しません

 * * * * * sh /home/v/test.sh

何が悪いのでしょうか?ありがとう

12
Elzo Valugi

男によると:

Cronデーモンは、HOMEディレクトリからサブシェルを起動します。ログインしていないときにコマンドを実行するようにスケジュールし、.profileファイル内のコマンドを実行する場合は、コマンドが.profileファイルを明示的に読み取る必要があります。

Cronデーモンは、HOME、LOGNAME、Shell(=/usr/bin/sh)を定義するすべてのシェルにデフォルト環境を提供します。
およびPATH(=/usr/bin)。

したがって、cronデーモンはphpがどこにあるかを認識していないため、たとえば、完全なphpパスを手動で指定する必要があります(実際のPHPパスがわかりません):

#!/bin/sh
/usr/local/bin/php /home/v/file.php
sh /root/x/some.sh

別の方法は、/ etc/profile(または.profile/.bashrc)をソースにすることです。たとえば、

* * * * * . /home/v/.bashrc ; sh /home/v/test.sh

これは、.bashrcが必要な環境変数(PATHなど)を設定している場合に役立ちます。

[〜#〜]編集[〜#〜]

興味深い読みは「 初心者:Intro to cron 」で、タイトルから記事を過小評価しないでください(それは皆のための読みです)、実際、それは完全に書かれていて、質問に完全に答えます:

...
PATHには、cronの検索パスに含まれるディレクトリが含まれます。たとえば、プログラム/ fooがディレクトリ/ usr/cog/binにある場合、/ usr/cog/binを追加する価値があります。これをパスに追加すると、呼び出すたびに「foo」へのフルパスを使用する必要がなくなります。
...

15
tmow

ターミナルから入力されたときにcronからではなくコマンドが機能する一般的な原因は、一般的な順に4つあります。

  1. Cronは、最小限の$PATHなどの限られた環境と、その他の予期される変数がないことを提供します。
  2. Cronはデフォルトで/ bin/shを呼び出しますが、他のシェルをインタラクティブに使用している可能性があります。
  3. Cronは%文字を特別に扱います(コマンドでは改行になります)。
  4. Cronは、ターミナルまたはグラフィカル環境を提供していません。

ジョブがエラーメッセージを含む出力を生成する場合、cronは出力全体をメールで送信します。ローカルで受信したメールを必ず読むか、読んだアドレスに転送してください。ローカルアカウントから他のアドレスにメールを転送するには、他のアドレスを ~/.forward に入れます。 cronジョブがシステムユーザー(rootwebmaster、…)として実行されている場合は、ユーザーのメールがあなた(およびその他の管理者)にリダイレクトされることを確認してください。ほとんどのメール設定で、root: elzoのような行を /etc/aliases に入れます。

Cronデーモンは通常、PATH環境変数がシステムのデフォルトに制限されているシェルでコマンドを実行します。/usr/bin:/ bin。

おそらく、phpコマンドは/ usr/binまたは/ binで使用できないため、cronを介して実行するとスクリプトが失敗し、そうでない場合は正常に実行されます。

Cronは通常、ジョブが完了した後、メールを介してエラーまたはジョブメッセージをrootユーザーに報告します(つまり、コマンドが終了ステータス!= 0を返すか、出力をstdout/stderrに生成する場合)。

システムによっては、これらのメッセージを取得するためにローカルのメール配信を設定する必要があります。

2
maxschlepzig