プロセスが実行中かどうかを判断し、それを利用して条件付きシェル スクリプトを作成する方法は?

プロセスが実行中かどうかを判断し、それを利用して条件付きシェル スクリプトを作成する方法は?

プロセスが実行中かどうかを判断し、その条件に基づいて bash スクリプトで何かを実行させるにはどうすればよいですか?

例えば:

  • プロセスabcが実行中の場合は、これを実行します

  • 実行されていない場合は、実行してください。

答え1

そのようなことを実行する bash スクリプトは次のようになります。

#!/bin/bash

# Check if gedit is running
# -x flag only match processes whose name (or command line if -f is
# specified) exactly match the pattern. 

if pgrep -x "gedit" > /dev/null
then
    echo "Running"
else
    echo "Stopped"
fi

このスクリプトは、プログラム「gedit」が実行されているかどうかを確認するだけです。

または、次のようにプログラムが実行されていないかどうかのみを確認することもできます。

if ! pgrep -x "gedit" > /dev/null
then
    echo "Stopped"
fi

答え2

ps aux | grep abcまたはのようなものを使用するソリューションにはpgrep abc欠陥があります。

なぜ?

特定のプロセスが実行中かどうかをチェックしているのではなく、 に一致する実行中のプロセスがあるかどうかをチェックしているのです。 という名前の実行可能ファイル(または名前や引数に が含まれているファイル)abcをどのユーザーでも簡単に作成して実行できるため、テストで誤検知が発生します。 、、に適用できるさまざまなオプションを使用して検索範囲を絞り込むことができますが、それでも信頼性の高いテストは得られません。abcabcpsgreppgrep

では、特定の実行中のプロセスを確実にテストするにはどうすればよいでしょうか?

それは、テストを何のために必要とするかによって異なります。

私はそのサービスを確実にしたいアブ実行中の場合は起動してください

これが systemd の目的です。サービスを自動的に起動して追跡し、サービスが停止したときに対応することができます。

見るゲーム サーバーがまだ実行中かどうかを確認するにはどうすればいいですか...その他のソリューションについては、

アブこれは私のスクリプトです。スクリプトのインスタンスが 1 つだけ実行されていることを確認する必要があります。

この場合は、ロックファイルまたはロックディレクトリを使用します。例:

#!/usr/bin/env bash

if ! mkdir /tmp/abc.lock; then
    printf "Failed to acquire lock.\n" >&2
    exit 1
fi
trap 'rm -rf /tmp/abc.lock' EXIT  # remove the lockdir on exit

# rest of script ...

見るバッシュ FAQ 45他のロック方法については、こちらをご覧ください。

答え3

私が使用しているのは次のものです:

#!/bin/bash

#check if abc is running
if pgrep abc >/dev/null 2>&1
  then
     # abc is running
  else
     # abc is not running
fi

平易な英語で言うと:'pgrep' が 0 を返す場合、プロセスは実行中です。それ以外の場合は実行されていません。


関連記事:

Bash スクリプト ::文字列の比較

Ubuntu マニュアルグレップ

答え4

@rommel-cid のアイデアを参考にして、pidofプロセスが存在しない場合にコマンドを実行するには || (||) を使用し、プロセスが存在する場合に何かを実行するには && を使用して、簡単な if/then/else 条件を作成できます。たとえば、実行中のプロセス (プロセス名が「chrome」である私の Chrome ブラウザ) と、存在しないプロセスをテストする例を次に示します。1>/dev/null を使用して標準出力を抑制し、印刷しないようにしました。

$ (pidof chrome 1>/dev/null && echo "its running? ok, so am i then" ) || echo "it's not running? ok i'll run instea\
d"
its running? ok, so am i then
$ (pidof nosuchprocess 1>/dev/null && echo "its running? ok, so am i then" ) || echo "it's not running? ok i'll run\
 instead"
it's not running? ok i'll run instead
$

関連情報