test.shスクリプトがあります
#!/bin/sh
php /home/v/file.php
sh /root/x/some.sh
コマンドラインからrootとしてファイルを実行すると機能します。
sh /home/v/test.sh
crontab -e(root cron)に設定すると機能しません。
* * * * * sh /home/v/test.sh
私は何が間違っていましたか?ありがとう
答え1
その男によると:
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」へのフルパスを使用する必要はありません。
...
答え2
端末にコマンドを入力したがcronで入力しなかったコマンドが機能しない一般的な理由は次のとおりです(通常の理由順)。
- Cronは限られた環境、つまり最小限を提供し、
$PATH
他の予想変数が不足しています。 - Cronはデフォルトで/ bin / shを呼び出しますが、対話的に他のシェルを使用することもできます。
- Cronは%文字を特別に処理します(コマンドで改行文字になります)。
- Cronは端末やグラフィック環境を提供しません。
ジョブがエラーメッセージを含む出力を生成すると、cronは出力全体を含む電子メールを送信します。現地から受け取ったメールを必ずお読みいただくか、読んだ住所にお届けください。ローカルアカウントから別のアドレスにメールを転送するには、別のアドレスを入力してください。~/.forward
。クローンジョブがシステムユーザー(root
、、...)として実行されている場合は、ほとんどのメール設定に対して、ユーザーのメールがあなたwebmaster
(および他の管理者)にリダイレクトされていることを確認してくださいroot: elzo
。/etc/aliases
。
答え3
cronデーモンは通常、PATH環境変数が/usr/bin:/binなどの一部のシステムデフォルトに制限されているシェルでコマンドを実行します。
/usr/binまたは/binでコマンドを使用できない可能性があるため、php
cronを介して実行するとスクリプトが失敗し、実行されないと正常に実行されます。
Cronは通常、ジョブが完了した後(つまり、コマンドが終了ステータス!= 0を返すかstdout / stderrに出力を生成した場合)、Eメールを介してルートにエラーまたはジョブメッセージを報告します。
システムによってこれらのメッセージを受信するには、ローカルメール配信を設定する必要があります。