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
プロセスの祖先を除外します。pgrep
Linuxには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