私のシェルスクリプトのpgrep:スクリプト自体を計算しませんか?

私のシェルスクリプトのpgrep:スクリプト自体を計算しませんか?

pgrepこれは私の行動です。FreeBSDスクリプト:

luis@Balanceador:~/Temporal$ cat test.sh
#!/usr/bin/env bash
pgrep -fl "test.sh"

luis@Balanceador:~/Temporal$ ./test.sh
luis@Balanceador:~/Temporal$

出力がありません。これは:スクリプト自体は検出されない走るように。コマンドラインの動作と同じですpgrep。私は大丈夫です。

これはLinux(Ubuntu)ケース:

luis@Terminus:~/Temporal$ cat test.sh
#!/usr/bin/env bash
pgrep -fl "test.sh"

luis@Terminus:~/Temporal$ ./test.sh
4514 bash
luis@Terminus:~/Temporal$

ご覧のとおり、スクリプトtest.sh自体は検出済み実行中のプロセスとして。

シェルを開発中です。スクリプトそれは可能でなければなりません止めるそして待つと他の例(同じ名前)が検出され、LinuxとFreeBSDで動作する必要があるので、このためにpgrepコマンドを均質化したいと思います。

両方の人をうまく行動させる方法はありますか?同じ

grep類似または許可された派生回答ps

テスト済み:

-x(正確な)スイッチは次のようになります。マニュアルページただし、次には適用されません。パラメータスクリプトで(またはどのように機能するかわかりません)。この場合、パラメータはインストルメンテーションにとって重要ではありません(すべてのパラメータにすることができます)。デフォルトの「.sh」スクリプトのみを計測するだけです。

追加の説明:

  • 「ファイルロックの使用」などの質問に答えないでください。実際、私はこのpgrepツールについて知りたいです。

ベストアンサー1

FreeBSDは、プロセスを実行するスクリプトインスタンスを含むpgrepプロセスの祖先を除外します。pgrepLinuxにはpgrepその機能はありません。

スクリプトインスタンスを手動で除外できます。除外するプロセスIDはにあります$$。少し注意してサブシェルを使用しないでください。最も簡単な方法pgrep … | grep -v "^$$ "は、おそらくパイプの右側をリストすることです(pgrep呼び出し前にプロセスのリストに達した場合)。 )grep

instances=$(pgrep -fl "test.sh")
if [[ "$instances" =~ (.*)$'\n'"$$ "[^$'\n']*$'\n'(.*) ]]; then
  instances=${BASH_REMATCH[1]}$'\n'${BASH_REMATCH[2]}
elif [[ "$instances" =~ (^|.*$'\n')"$$ "[^$'\n']*($|$'\n'.*) ]]; then
  instances=${BASH_REMATCH[1]}${BASH_REMATCH[2]}
fi

おすすめ記事