2

check_process.sh特定のプロセスが実行されているかどうかを確認する小さなスクリプト (と呼ばれる) を作成したいと考えて$PROC_NAMEいます。存在する場合は、その PID を返すか、そうでない場合は -1 を返します。

私の考えはpgrep -f <STRING>、コマンド置換で使用することです。

このコードをコマンド ラインで直接実行すると、次のようになります。

export ARG1=foo_name
export RES=$(pgrep -f ${ARG1})
if [[ $RES == "" ]]; then echo "-1" ; else echo "$RES"; fi

すべてがうまくいきます:PIDまたはプロセスのステータスに応じて-1。

私のスクリプトcheck_process.shには、同じ行に加えて、プロセスの名前を渡すための追加の変数が含まれています。

#!/bin/bash
export ARG1=$1
export RES=$(pgrep -f ${ARG1})
if [[ $RES == "" ]]; then echo "-1" ; else echo "$RES"; fi

しかし、このコードは機能しません。プロセスが現在実行されている場合は、2 つ PIDの s (プロセスの PID とその他のもの...) を取得しますが、実行されていないプロセスをチェックすると、他のものを取得します!

私は困惑しています。何か案が?前もって感謝します!

4

1 に答える 1

2

スクリプト内に-aフラグを追加すると、次のようなものが表示されます(実行しました):pgrep./check_process.sh vlc

17295 /usr/bin/vlc --started-from-file ~/test.mkv
18252 /bin/bash ./check_process.sh vlc

したがって、「何か他のもの」はpid、実行中のスクリプト自体です。

pgrepマニュアルでは、-fフラグについて説明しています。

通常、パターンはプロセス名に対してのみ照合されます。-f が設定されている場合、完全なコマンド ラインが使用されます。

明らかに、スクリプト コマンド ラインにはルックアップ プロセス名 ( 'vlc') が引数として含まれているため、pgrep -f結果に表示されます。

プロセス名の一致だけを探している場合は、-fフラグを削除して目的の結果を得ることができます。

フラグを使用したい場合は-f、現在の を除外できますpid:

#!/bin/bash
ARG1=$1
TMP=$(pgrep -f ${ARG1})
RES=$(echo "${TMP}" | grep -v $$)
if [[ $RES == "" ]]; then echo "-1" ; else echo "${RES}"; fi
于 2016-08-17T09:50:48.667 に答える