プロセスが実行されているかどうかを判断し、bashスクリプトにその条件に基づいて何かを実行させるにはどうすればよいですか?
例えば:
プロセス
abc
が実行されている場合、これを行います実行されていない場合は、実行します。
プロセスが実行されているかどうかを判断し、bashスクリプトにその条件に基づいて何かを実行させるにはどうすればよいですか?
例えば:
プロセスabc
が実行されている場合、これを行います
実行されていない場合は、実行します。
回答:
そのようなことを行う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
/dev/null
:「/ dev / nullはコマンドの標準出力をnullデバイスにリダイレクトします。nullデバイスは、書き込まれた情報を破棄する特別なデバイスです」...を使用0
すると、コマンド出力がというファイルにリダイレクトされ0
ます。この場合、より快適になる> /dev/null
ことをお勧めします-出力を破棄する標準/適切な方法であるため、どこにでも表示されます。
-x
パラメータを追加してpgrep
、正確なアプリケーションを探すようにしてください。そうしないと、別のアプリの名前の中に同じ文字列が見つかった場合に誤った修正が行われます。私はそれを見つけるために1時間を費やしました。
! pgrep
のようなものを使用するps aux | grep abc
かpgrep abc
、欠陥があるソリューション。
特定のプロセスが実行されているかどうかを確認していないため、一致するプロセスが実行されているかどうかを確認していますabc
。すべてのユーザーは、名前の付いたabc
(またはabc
名前または引数にどこかに含まれる)実行可能ファイルを簡単に作成して実行できるため、テストで誤検出が生じます。そこにあなたがに適用できるさまざまなオプションがありps
、grep
およびpgrep
検索を絞り込むために、あなたはまだ信頼性の高いテストを取得することはできません。
それは、テストの対象によって異なります。
これがinitとupstartの目的です。サービスを開始し、そのpidがpidfileに保存されるようにします。(initまたはupstartを介して)サービスの再起動を試行すると、pidfileがチェックされ、存在しない場合は開始するか、既に実行されている場合は中止されます。これはまだ100%信頼できるものではありませんが、あなたが得るのと同じくらい近いです。
参照してくださいどのように私は私のゲームサーバはまだ...実行されているかどうかを確認することができ、他のソリューションを。
この場合、ロックファイルまたはロックディレクトリを使用します。例えば
#!/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 ...
ロックの他の方法については、Bash FAQ 45をご覧ください。
pgrep
またはのようなものps
は完全に適切であり、あなたのアプローチは過剰に思えます。ただし、公開配布用のスクリプトを作成する場合は、可能な限り安全な方法で作成する必要があります。
rm
コマンドが実行されます。そのため、トラップが設定された後に終了する限り、ロックは解除されます。
これは私が使用するものです:
#!/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マニュアルpgrep
pgrep
同じ15文字の制限「機能」前述している、したがって、例えば、pgrep gnome-power-manager
また失敗する
-x
オプションを使用してください。「名前(または-fが指定されている場合はコマンドライン)がパターンと完全に一致するプロセスのみに一致します。」
@ 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
$
確認する必要のあるバイナリがシステム全体にインストールされていないため、「単純な」ソリューションはどれも役に立ちませんでした。したがって、パスを使用して確認する必要ps -ef | grep
があります。
app="$_sdir/Logic 1.2.18 (64-bit)/Logic"
app_pid=`ps -ef | grep "$app" | awk '{print $2}'`
if `ps -p $app_pid > /dev/null`; then
echo "An instance of logic analyzer is appear to be running."
echo "Not starting another instance."
exit 5
else
nohup "$app" &> /dev/null &
fi
を使用してstart-stop-daemon
:
/sbin/start-stop-daemon --background --make-pidfile --pidfile /tmp/foo.pid -S --startas /usr/bin/program -- arg1 arg2
通常のユーザーとして機能します。
@John Vrbanacによって投稿された受け入れられた回答は私には役に立たず、@ geirhaによって投稿された回答は元の質問には答えないことがわかりました。
John Vrbanacのソリューションは、PHPプロセスが実行されているかどうかを確認できませんでした。CentOS7を実行しています。
@geirhaの答えは、インスタンスが別のインスタンスを開始する前に既に実行されていないことを確認するだけです。これは元の質問ではなく、元の質問はプロセスが実行されているかどうかを確認することでした。
ここに私のために働いたものがあります:
プロセスのプロセス名に「Jane」という文字列が含まれていたとします。これにより、実行中かどうかがわかります。これは、BASHおよびPHPスクリプトで機能します。
ps -aux | grep "[J]ane" > /dev/null 2>&1
if [[ "$?" == "0" ]]; then
echo "It's running"
else
echo "It's not running"
fi
## bash
## function to check if a process is alive and running:
_isRunning() {
ps -o comm= -C "$1" 2>/dev/null | grep -x "$1" >/dev/null 2>&1
}
## example 1: checking if "gedit" is running
if _isRunning gedit; then
echo "gedit is running"
else
echo "gedit is not running"
fi
## example 2: start lxpanel if it is not there
if ! _isRunning lxpanel; then
lxpanel &
fi
## or
_isRunning lxpanel || (lxpanel &)
注:pgrep -x lxpanel
または、pidof lxpanel
まだlxpanel
機能していない(ゾンビ)場合でも実行されていると報告します。稼働中のプロセスを取得するにはps
、使用する必要がありますgrep
#!/bin/bash
while [ true ]; do # Endless loop.
pid=`pgrep -x ${1}` # Get a pid.
if [ -z $pid ]; then # If there is none,
${1} & # Start Param to background.
else
sleep 60 # Else wait.
fi
done
zombie
プロセスのようなプログラムの異なる状態に私を惹きつけました(「実行中」プロセスとは言いません)。何の完全なリストSTAT
列の値は、出力の中にps
、あることを示し、ここでこれを収容し、答えを書き、または自分自身を編集するに傾斜のためのもの。