test.shスクリプトがあります
#!/bin/sh
php /home/v/file.php
sh /root/x/some.sh
コマンドラインからルートとしてファイルを実行すると動作します。
sh /home/v/test.sh
crontab -e(ルートcron)に設定すると、機能しません
* * * * * sh /home/v/test.sh
何が間違っていますか?ありがとう
test.shスクリプトがあります
#!/bin/sh
php /home/v/file.php
sh /root/x/some.sh
コマンドラインからルートとしてファイルを実行すると動作します。
sh /home/v/test.sh
crontab -e(ルートcron)に設定すると、機能しません
* * * * * sh /home/v/test.sh
何が間違っていますか?ありがとう
回答:
男によると:
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)を設定する場合に便利です
編集
興味深い読み物は「初心者:cronの紹介」です。タイトルの記事を過小評価しないでください(すべての人にとって読み物です)。
...
PATHには、cronの検索パスに含まれるディレクトリが含まれます。たとえば、ディレクトリ/ usr / cog / binにプログラム 'foo'がある場合、/ usr / cog / binを追加する価値があります。呼び出すたびに 'foo'へのフルパスを使用する必要がなくなるため、パス。
...
cronからではなく端末で入力された場合に機能するコマンドには、一般的な順に4つの一般的な原因があります。
$PATH
、およびその他の予期される変数が欠落しているなど、限られた環境を提供します。ジョブがエラーメッセージなどの出力を生成する場合、cronは出力全体を含む電子メールを送信します。ローカルで受信したメールを必ず読むか、読んだアドレスに転送してください。ローカルアカウントから他のアドレスにメールを転送するには、他のアドレスをに入れます~/.forward
。cronジョブは、(システム・ユーザーとして実行されている場合root
、webmaster
...、)、ユーザーのメールがあなた(および他の管理者)にリダイレクトされていることを確認してください。ほとんどのメール設定では、のような行を追加root: elzo
し/etc/aliases
ます。
通常、cronデーモンは、PATH環境変数がシステムのデフォルト(例:/ usr / bin:/ bin)に制限されているシェルでコマンドを実行します。
おそらく、php
コマンドは/ usr / binまたは/ binで使用できないため、cronを介して実行するとスクリプトは失敗し、そうでない場合は正常に実行されます。
Cronは通常、ジョブの終了後、エラーまたはジョブメッセージをメールでrootユーザーに報告します(つまり、コマンドが終了ステータス!= 0を返すか、stdout / stderrに出力を生成するとき)。
システムによっては、これらのメッセージを取得するためにローカルメール配信を設定する必要があります。