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


12

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

何が間違っていますか?ありがとう


「機能していません」は機能していません。見る?あなたは私が何を意味するのか分からず、私たちはあなたが何を意味するのか分からないのです。私は(はい)を意味するものに動作していませんか?何でもいいです。tmowの推測は正しいかもしれませんが、それは単なる推測です(そして、私は思うにかなり良いものですが、それでも)。
ユルゲンA.エアハルト

はい、表示されている結果をより具体的に特定できる場合、問題の内容をより正確に判断できます。つまり、「機能していない」とはどういう意味ですか(:
gabe。11年

syslogにログが表示されず、スクリプトがdbへの挿入を行っていますが、この挿入は実行されておらず、手動でスクリプトを実行すると発生します。
エルゾヴァルギ

回答:


15

男によると:

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'へのフルパスを使用する必要がなくなるため、パス。
...


悪い$ PATHは、cronからではなく、手動で動作するスクリプトの最も一般的な原因です。
パトリック

@Patrickもちろん、cronがphpの場所を知らない場合は問題になります。そうでない場合、Elzoのcrontabは問題なく動作し、PATHの問題になります。
tmow

ご回答ありがとうございます。それは私にとって非常に簡単に機能しました!!! .. @tmowに感謝します。
ヴィニェシュプラジャパティ

5

cronからではなく端末で入力された場合に機能するコマンドには、一般的な順に4つの一般的な原因があります。

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

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


2

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

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

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

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

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