2017-03-08 59 views
1

在bash腳本中,我想在前臺啓動一個進程,然後打印所有進程名稱和PID作爲該進程的子進程啓動的列表。例如,假設我有以下的腳本,但我只能修改第一個:Bash:一個命令的所有子進程的PID

A.sh:

#!/bin/bash 
B.sh 

B.sh:

#!/bin/bash 
C.sh 

C.sh:

#!/bin/bash 
echo "Running C.sh" 

不修改B.sh,C.sh或echo命令,並且不在後臺啓動任何子進程,我想A.sh打印以下:

B.sh 1208 
C.sh 1210 
echo 1211 

能A.sh叉,而子進程中A.sh的前臺運行,記錄這個信息的過程?

回答

2

更新:在我的回答如下的評論事實證明:

我需要的東西,觀察創建所有子進程期間時間跨度。鑑於此,篩選隔離我的子樹並不困難。

...是問題背後的意圖,它是爲了調試目的。

在這種情況下,我建議使用strace這樣的:

strace -f command 

-f將跟蹤子進程 - 遞歸。由於分叉和執行需要系統調用,因此strace將列出任何子創建加上pid。


原來的答覆:

您可以使用pgrep爲:

run_process & 
pid=${!} 
pgrep --parent "${pid}" 
wait # wait for run_process to finish 

順便說一句,你可能想使用pstree命令,它是很好的使用方法:

run_process & 
pid=${!} 
pstree -p "${pid}" 
wait # wait for run_process to finish 

總之,您需要安裝pstree

+0

正如我在問題中提到的,我不想在後臺啓動任何進程。 &運算符在後臺啓動一個進程。有沒有辦法在即將在前臺運行的命令上使用'pstree'? –

+0

應該怎麼辦?只能有一個前臺進程。但是在後臺啓動這個過程有什麼問題?在我的答案中添加了'wait'命令。這基本上適合你。除了一點,你如何確保這個過程在你問的那一刻已經開始了呢? – hek2mgl

+0

分叉只會給我B.sh的PID。即使我在B.sh跑的時候不斷地調查'pstree',我仍然可能會想念一些孩子。我需要一些觀察在一段時間內創建所有子進程的東西。鑑於此,篩選隔離我的子樹並不困難。 –

0

你可以嘗試用A.sh

這樣
#!/usr/bin/env bash 
./B.sh & 
b_PID=$! 
./C.sh & 
c_PID=$! 

echo "B.sh $b_PID" 
echo "C.sh $c_PID" 

輸出會是這個樣子

B.sh 22802 
C.sh 22803 
Running C.sh 
+0

正如我在問題中提到的,我不想在後臺啓動任何進程。 '&'運算符在後臺啓動一個進程。所以這就是我不想要的東西。 –

+0

@ByronHawkins如果你沒有在後臺啓動'B.sh','A'不能做任何事*直到'B.sh'完成,更不用說做你想做的事了。 – chepner

+0

它不可能爲你問拜倫。這個過程需要分叉 – NinjaGaiden