2017-03-08 6 views
1

bash 스크립트에서 포어 그라운드에서 프로세스를 시작한 다음 해당 프로세스의 하위로 시작한 모든 프로세스 이름과 PID 목록을 인쇄하려고합니다.Bash : 명령의 모든 하위 프로세스의 PID

#!/bin/bash 
C.sh 

C.sh를 : : 예를 들어, 나는 다음과 같은 스크립트가 있다고 가정하지만, 나는 단지 첫 번째 수정할 수 있습니다

A.sh :

#!/bin/bash 
B.sh 

B.sh을

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

B.sh, C.sh 또는 echo 명령을 수정하지 않고 백그라운드에서 하위 프로세스를 시작하지 않고,

B.sh 1208 
C.sh 1210 
echo 1211 

는 포크에게 자식 프로세스가 A.sh의 전경에서 실행하는 동안이 정보를 기록하는 과정을 A.sh 수 : 나는 다음과 같은 인쇄 A.sh을 하시겠습니까?

답변

2

업데이트처럼 보일 것이다

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

A.sh

와 함께이 일을 시도 할 수 있습니다 :
을 내 대답은 아래 설명에서이 밝혀졌다 :

나는 모든 하위 프로세스를 생성하는 동안 시간의 범위. 그렇다면 하위 트리를 분리하기위한 필터링은 어렵지 않습니다.

... 질문의 의도는 디버깅 목적이었습니다.

이 경우이 같은 strace를 사용하는 것이 좋습니다 것 :

strace -f command 

-f가 자식 프로세스를 추적합니다 - 재귀. 분기 및 실행에는 시스템 호출이 필요하기 때문에 strace은 하위 작성 및 pid를 나열합니다.


원래 답 :

당신은 그것을 위해 pgrep를 사용할 수 있습니다

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

, 당신은 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

당신은 출력이

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

질문에서 언급했듯이 백그라운드에서 어떤 프로세스도 시작하고 싶지 않습니다. '&'연산자는 백그라운드에서 프로세스를 시작합니다.그래서 제가 특별히 원하지 않는 어떤 것입니다. –

+0

@ByronHawkins 백그라운드에서'B.sh'를 시작하지 않으면'B.sh'가 완료 될 때까지'A'는 * anything *을 할 수 없습니다. – chepner

+0

당신이 바이런에게 묻고있는 것은 불가능합니다. 프로세스가 분기되어야 함 – NinjaGaiden