プロセスが実行中かどうかを判断し、その条件に基づいて 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
をどのユーザーでも簡単に作成して実行できるため、テストで誤検知が発生します。 、、に適用できるさまざまなオプションを使用して検索範囲を絞り込むことができますが、それでも信頼性の高いテストは得られません。abc
abc
ps
grep
pgrep
では、特定の実行中のプロセスを確実にテストするにはどうすればよいでしょうか?
それは、テストを何のために必要とするかによって異なります。
私はそのサービスを確実にしたいアブ実行中の場合は起動してください
これが 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
答え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
$