2012-07-18 55 views

回答

12

要獲得bash腳本的PID,您可以使用變量$$

然後,爲了獲得它的孩子,你可以運行:

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

ps將返回父PID的列表。然後grep過濾所有與bash腳本的子項無關的進程。爲了得到孩子的數量,你可以這樣做:

num_children=`echo $children | wc -w` 

其實你會得到將由1被關閉,因爲ps數量將是bash腳本的孩子了。如果你不想算ps作爲一個孩子的執行,那麼你可以解決這個問題有:

let num_children=num_children-1 

UPDATE:爲了避免調用grep,下面的語法可以使用(如果支持由ps安裝的版本):

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

'grep -w $ bash_pid'以防bash pid是子進程ID的子字符串。 – chepner 2012-07-18 13:21:16

+0

@chepner好點!我會解決這個問題。謝謝! :) – betabandido 2012-07-18 13:22:01

+0

不確定,但我認爲額外的過程是包含ps/grep管道的子shell。只是迂腐:) – chepner 2012-07-18 13:45:53

2

使用ps--ppid選項選擇當前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 

(注:這需要Linux版本的ps--ppid我不知道是否有用於BSD ps或不等價。)

+0

不適用於我。給我一個'ps:非法選項 - '。也許你正在假設ps的特定版本? – ghoti 2012-07-18 13:32:36

+0

是的,我假定Linux使用的版本。 – chepner 2012-07-18 13:43:35

+0

啊。我在FreeBSD和OSX上測試過。 – ghoti 2012-07-18 13:56:38

-2

您可以評估shell內建命令作業像:

counter = `jobs | wc -l` 
+1

計算作業,而不是進程。作業可以由多個進程組成。 – chepner 2012-07-18 13:31:04

+1

等號周圍沒有空格。使用'$()'而不是反引號。 – 2012-07-18 13:53:16

4

您還可以使用p纖ep:

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

使用pgrep --parent $$可以獲取bash進程子項的列表。
然後使用wc -l在輸出獲得的行數:$(pgrep --parent $$ | wc -l) 然後減去1(wc -l報告1,即使pgrep --parent $$爲空)

3

我喜歡:

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

它衍生只是一個過程中,您不必計算單詞或通過管道中的程序調整PID的數量。

實施例:

~ $ echo $(pgrep -c -P$$) 
0 
~ $ sleep 20 & 
[1] 26114 
~ $ echo $(pgrep -c -P$$) 
1