0

私はこのユーザー crontab を持っています (コマンド crontab -e を介してアクセスします):

# m h  dom mon dow   command
*/3 * * * *          sh /home/FRAPS/Desktop/cronCheck.sh

スクリプト cronCheck.sh は次のようになります。

#!/bin/sh
SERVICE='Script'

if ps ax | grep -v grep | grep -i "$SERVICE" > /dev/null
then
    echo "######## $SERVICE service running, everything is fine ##################\n" >> CronReport.txt
else
    echo "$SERVICE is not running. Launching it now\n" >> CronReport.txt
    perl Script.pl 
fi

独自のディレクトリからスクリプト (cronCheck.sh) を起動すると、魅力的に動作しますが、cron が起動すると、「スクリプト」が実行されていないにもかかわらず、常に「# $SERVICE サービスが実行されています。すべて問題ありません ###」と表示されます。 .

ありがとう、

4

5 に答える 5

2

grep -v grep の後にを付ける必要がありgrep -i "$SERVICE"ます。あなたが今持っている方法は、真実であることが保証されています.

于 2010-09-10T16:15:44.950 に答える
2

その条件を記述するさらに良い方法を次に示します。

services=$(ps -e -o comm | grep -cFi "$SERVICE")
case "$services" in
    (0) 
        # restart service
    ;;
    (1)
        # everything is fine
    ;;
    (*)
        # more than one copy is running
    ;;
esac

引数ではなく、実際のプロセス名のみが ps 出力に表示されるため、を使用ps -e -o commすることで、ばかげたことを行う必要がなくなります。grep -v grepまたgrep -cFi、一致をカウントして数値を表示するため、パイプラインの終了ステータスを処理する必要がありません。

PATHまた、他のポスターが示唆しているように、変数を設定してこのスクリプトを開始する必要があります。

PATH=/bin:/usr/bin:/sbin:/usr/sbin
export PATH

/usr/local/binシステムによっては、そのリストの先頭に配置したい場合としない場合があります。そこから何も必要ない場合は、それを行わないでください。

最後のアドバイス: ユーザーの監視なしで実行されるスクリプト (cron ジョブなど) を作成する場合set -eは、最初に配置することをお勧めします。そのため、コマンドが失敗した場合、それらは失敗して終了します。

于 2010-09-10T16:50:06.953 に答える
1

そのようなパイプの戻りステータスを確認すると、問題が発生する可能性があります。$PIPESTATUS 配列を確認するか、最後の grep を wc -l にパイプして行数をカウントする必要があります。

于 2010-09-10T15:48:01.367 に答える
1

通常、cron は、ユーザー アカウントのように多くの環境をセットアップしません。適切にセットアップするには、スクリプトを変更する必要がある場合があります。

于 2010-09-10T16:28:18.237 に答える
1

cron ジョブは、シェル プロンプトで取得するのと同じ環境設定を取得しません。これらは通常、ログイン時にシェルによって設定されます。そのため、全体を通して相対パスではなく絶対パスを使用する必要があります。(つまり、PATH 環境変数が存在するか、シェル プロンプトでの設定と同じように設定されると想定しないでください。また、スクリプトがホーム ディレクトリに設定された PWD で実行されると想定しないでください。)

  • crontab エントリを次のように置き換えますsh(/bin/shまたは、cronCheck.sh が実行可能な場合は削除します。shebang 行で行います)。
  • cronCheck.sh で、ログ ファイルと perl スクリプトへのパスを追加します。

cronCheck.sh は次のようになります。

#!/bin/sh
SERVICE='Script'

if ps ax | grep -v grep | grep -i "$SERVICE" > /dev/null
then
    echo "######## $SERVICE service running, everything is fine ##################\n" >> CronReport.txt
else
    # Specify absolute path to a log file that's writeable for the user the
    # cron runs as (probably you). Example: /tmp/CronReport.txt
    echo "$SERVICE is not running. Launching it now\n" >> /tmp/CronReport.txt

    # Specify absolute path to both perl and the script. Example: /usr/bin/perl
    # and /home/FRAPS/scripts/Script.pl
    /usr/bin/perl /home/FRAPS/scripts/Script.pl 
fi

(繰り返しますが、Script.pl が実行可能であり、shebang 行に正しい perl へのパスがある場合は、/usr/bin/perl ビットを取り除くことができます。)

于 2010-09-10T16:41:59.157 に答える