2017-06-26 6 views
3

私はtest.shという名前の、シェルスクリプトを持っている:バッシュ - 1つのスクリプトの2つのプロセス

#!/bin/bash 
echo "start" 
ps xc | grep test.sh | grep -v grep | wc -l 
vartest=`ps xc | grep test.sh | grep -v grep | wc -l ` 
echo $vartest 
echo "end" 

出力結果は次のとおりです。

start 
1 
2 
end 

2つのテストがあり、なぜ私の質問は、あります私がpsを直接呼び出すときではなく、 ``($()で同じことが起こる)を使ってpsを呼び出すときに実行される.shプロセスです。 希望の結果(1)を取得するにはどうすればよいですか?

+0

4.3.11で再現可能です。何が原因で起こっているのか分かりません。 – Blacksilver

+0

'ps..'で始まるあなた自身の行は、秒psでも表示されるかもしれませんので、私は – derHugo

+0

@derHugoと推測します。もし私が私のpsを置くなら、最も早く10回前に10行、この行はまだ1を出力します – user6050469

答えて

6

バックシェルと同様に、サブシェルを起動すると、bashフォーク自体が実行され、実行したいコマンドが実行されます。また、パイプラインを実行してそれらのすべてをそれら自身のサブシェルで実行させるので、パイプラインが終了するのを待っているスクリプトの「余分な」コピーが終わるので、出力を集めて戻すことができます元のスクリプト。私達はちょうど私たちの文字列に一致するプロセスを示す、サブシェルで明示的にプロセスを実行するために(...)を使用して私たちのためにps | grep "name" | grep -v grepを行いpgrepコマンドを使用して少しexpermimentをやる

echo "Start" 
(pgrep test.sh) 
(pgrep test.sh) | wc -l 
(pgrep test.sh | wc -l) 
echo "end" 

たaの上に私のために実行すると、出力を生成します。

Start 
30885 
1 
2 
end 

だから我々はサブシェルでpgrep test.shを実行すると、それだけでサブシェルがパーであっても、test.shの単一のインスタンスを見つけることがわかりますパイプライン自体のしかし、サブシェルにパイプラインが含まれている場合は、パイプラインが終了するのを待つスクリプトのフォークコピーを取得します。

+0

'pgrep test.sh'が何をしているのか、'(foo) 'が何をするのかを説明するコメントを追加できますか? – Blacksilver

+0

@Blacksilver 'ps' +' grep' = 'pgrep' – ceving

+0

私はtestvar =' sleep 20'だけを実行するファイルの作成を試みました。私はスクリプトを実行し、スクリプトが実行中(スリープ中)にpsを使ってプロセスをチェックします。この場合、test.shファイルは1つだけです。 backticksを使用しても必ずしも新しいプロセスを意味するわけではありません。サブプロセスを持つ別の条件がありますか? (私はパイプを使用しているのと同じですか?)ありがとう! – user6050469

関連する問題