GNU/Linux >> Linux の 問題 >  >> Linux

スクリプト実行時の重複したcronジョブの管理

一連の時間中に、Linuxデバイスで特定のパターンがCPU /メモリ使用率の高いアラームをトリガーするのを観察した場合は、アラーム時に実行されていた一連のプロセスを分析することをお勧めします。

分析中に、スケジュールされたプロセス(cronジョブを使用して設定された)での呼び出しが重複しているため、特定のプロセスまたはスクリプトが複数のインスタンスを同時に実行していることがわかる場合があります。

これを防ぐには、次の2つの方法を使用できます。

ロックファイルの設定

スクリプト内で、ファイルが存在するかどうかを確認する手順を実装します。そうでない場合、スクリプトはそれを作成し、期待どおりに実行を継続します。スクリプトの完了後にファイルが不要な場合は、ファイルを削除して、ジョブの次回の実行でファイルが「使用中」と見なされないようにすることができます。

PIDファイルの設定 BASHで

上記の方法と同様に、プロセスID(PID)ファイルの使用はファイルの読み取りに依存しますが、このファイル内に実行中のインスタンスのPIDが配置される点が異なります。これにより、プロセスがプロセスであるかどうかを検証できます。が実行されている間、ロックファイルはスクリプトの実行が開始されたことを確認するだけで、スクリプトがまだ実行されているかどうか、またはファイルが削除される前に一時停止/終了されたかどうかは無視されます。

これを設定する手順:

以下のコードスニペットから、スクリプト内に実装するコードのサンプルを確認できます。ポンド記号(#)で始まるテキストはコード内のコメントであるため、最終的な実装で削除できます。

注: 最初に、スクリプトがニーズに合っているかどうかをテストする必要があることに注意してください。最初の試行で機能する可能性があると思い込まないでください。変更が必要になる場合があります。

# A. Define your PID file using the full path where it'll be located.
# Do not place your code within any /tmp folder as these get cleaned up automatically and might interfere with the expected behaviour of the script.

# B. Check if the PID file exists, if it does, it will run the intended function.
PIDFILE = /var/apps/testscript.pid

# 1. Read the content of our PID file (with cat), and assign it to the PID variable
if [ -f $PIDFILE ] then
    # 2. Verify if the content of the file is a running process
    PID = $(cat $PIDFILE)

    # In here, the '%?' variable obtains the exit code from our previous command
    ps -p $PID > /dev/null 2>&1

    # 3. If the content of the file is a process (an output equal to 0 means succesful), output a message, and exit the application.
    if [ $? -eq 0 ] then
        echo "Job is already running"
        exit 1
    else
        # 4. If the exit code was not succesful, we assume the process was not running, so we place the current process ID into the PID File
        echo $$ > $PIDFILE
        if [ $? -ne 0 ] then
        echo "Could not create PID file"
        exit 1
        fi
    fi
# C. If the PID file does not exist, it will attempt to create it, then run the code
else
    # 1. This outputs the current PID into the PID file:
    #  The '$$' value is a variable for the current PID.
    #  The '>' operand directs the output from echo to a file
    echo $$ > $PIDFILE

    # 2. If the exit code was not succesful, output an error message, and exit the application.
    if [ $? -ne 0 ]
    then
        echo "Could not create PID file"
        exit 1
    fi
fi

# *** In here you need to insert the original script code *** #

# D. Remove the PID file so we try to always have a "clean slate"
rm $PIDFILE
その他のソリューション

上記の2つの選択肢に加えて、実装できるさまざまなユーティリティがあります。

群れ

flockコマンドは、シェルスクリプトからのロックを管理する新しいLinuxディストリビューションにインストールされているユーティリティです

使用法の詳細については、以下のURLの公式ドキュメントを参照してください。

  • https://manpages.ubuntu.com/manpages/xenial/man1/flock.1.html

flockの便利な点は、元のプロセスが完了するまでファイルロックが保持され、その時点でflockがファイルロックを解放することです。これは、プロセスが正常に完了したか失敗したかにかかわらず当てはまります。

ソロ

Soloは、スクリプトの実行をファイルではなくネットワークポートにバインドするPerlスクリプトです。

詳細については、公式Webサイトを参照してください。

  • https://www.timkay.com/solo/.

他の実装と同様に、これにより、割り当てられたスクリプトが完了した後にのみ解放されるロックが作成されます。

$ ./solo -port=1234 /var/tmp/script.sh & 1234
$ ./solo -port=1234 /var/tmp/script.sh
solo(1234): Address already in use

ファイルの代わりにポートをバインドする利点は、ポートを削除できないことです。他の実装では、既存のロックを「解放」して、ジョブのインスタンスを複製できるようにします。

追加のメモ

上記のユーティリティとプラクティスは重複するジョブの実行を防ぎますが、デバイスと操作のパフォーマンスを妨げる可能性のある重複するジョブやリソースの過度の使用を避けるために、cronジョブがどのように相互作用するかを監視することが重要です。

関連記事
  • 群れコマンド
  • SoloPERLスクリプト。

コメントや質問をするには、[フィードバック]タブを使用します。私たちと会話を始めることもできます。


Linux
  1. 私のcronジョブが機能しません

  2. 1 時間ごとに実行可能ファイルを実行するように cron ジョブを設定する方法は?

  3. 毎週の cron ジョブをテストする

  1. TrueNASでcronジョブを設定する方法

  2. Linux PID のリサイクル

  3. cron ジョブが完了したことを確認する

  1. ファイル記述子リンクの移植性?

  2. Zipファイルのエンコード?

  3. 実行可能ファイルがない場合