2012-07-18 20 views

答えて

12

bashスクリプトのPIDを取得するには、変数$$を使用できます。

すると、その子を取得するために、次のコマンドを実行します。

bash_pid=$$ 
children=`ps -eo ppid | grep -w $bash_pid` 

psは、親のPIDのリストを返します。 grepは、bashスクリプトの子に関係のないすべてのプロセスをフィルタリングします。あなたが行うことができます子供の数を得るために:psがあまりにもbashスクリプトの子になりますので、

num_children=`echo $children | wc -w` 

実際にあなたが得る数は、1でオフになります。

let num_children=num_children-1 

UPDATE:grepを呼び出さないようにするためにサポートされている場合、次の構文は、(使用されるかもしれないあなたが子供としてpsの実行をカウントしたくない場合は、していることだけで修正することができますpsのインストール版)によって:

num_children=`ps --no-headers -o pid --ppid=$$ | wc -w` 
+3

bash pidが子のプロセスIDの部分文字列である場合の 'grep -w $ bash_pid'。 – chepner

+0

@chepner良い点!私はそれを修正します。ありがとう! :) – betabandido

+0

わかりませんが、余分なプロセスはps/grepパイプラインを含むサブシェルだと思います。ちょうどペタニチである:) – chepner

2

--ppidオプションで使用psは、現在のbashプロセスの子を選択します。

bash_pid=$$ 
child_count=$(ps -o pid= --ppid $bash_id | wc -l) 
let child_count-=1 # If you don't want to count the subshell that computed the answer 

(注:これは--ppidためpsのLinuxバージョンを必要とBSD psかの等価があるかどうかはわからない。。)

+0

私のために働かない。私に 'ps:違法オプション - 'を与えます。おそらくあなたはpsの特定のバージョンを想定していますか? – ghoti

+0

はい、私はLinuxで使用されているバージョンを想定していました。 – chepner

+0

ああ。私はFreeBSDとOSXでテストしました。 – ghoti

-2

あなたが好きなシェル組み込みコマンドの仕事を評価することができます:

counter = `jobs | wc -l` 
+1

これは、プロセスではなくジョブを数えます。ジョブは、複数のプロセスで構成できます。 – chepner

+1

等号のまわりにスペースは入れません。バッククォートの代わりに '$()'を使います。 –

4

また、pgrepコマンドを使用することができます。

child_count=$(($(pgrep --parent $$ | wc -l) - 1))

pgrep --parent $$を使用して、bashプロセスの子のリストを取得します。
その後の行数を取得するために出力にwc -lを使用します。$(pgrep --parent $$ | wc -l) その後、私は好む1(pgrep --parent $$が空で1でもwc -lレポート)

3

を引く:

num_children=$(pgrep -c -P$$)

をそれはちょうど1を生成しますプロセスでは、単語を数えたり、パイプ内のプログラムによってPIDの数を調整したりする必要はありません。

例:

~ $ echo $(pgrep -c -P$$) 
0 
~ $ sleep 20 & 
[1] 26114 
~ $ echo $(pgrep -c -P$$) 
1 
関連する問題