이것은 pstree
매우 좋은 해결책이지만 약간의 회답입니다. ps --forest
대신에 사용 합니다. 그러나 특정 프로세스 만 인쇄하기 때문에 PID
( -p
)가 아니라 세션 ( -g
)에 대한 것입니다. 옵션을 ps
정의하는 멋진 ASCII 아트 트리에 인쇄 할 수 있는 모든 정보 를 인쇄 할 수 있습니다 -o
.
따라서이 문제에 대한 나의 제안 :
ps --forest -o pid,tty,stat,time,cmd -g 2795
프로세스가 세션 리더가 아닌 경우 조금 더 많은 트릭을 적용해야합니다.
ps --forest -o pid,tty,stat,time,cmd -g $(ps -o sid= -p 2795)
현재 프로세스의 세션 ID (SID)를 먼저 얻은 다음 해당 sid로 ps를 다시 호출합니다.
열 헤더가 필요하지 않은 경우 '-o'옵션의 각 열 정의 뒤에 '='를 추가하십시오.
ps --forest -o pid=,tty=,stat=,time=,cmd= -g $(ps -o sid= -p 2795)
예제 실행 및 결과 :
$ ps --forest -o pid=,tty=,stat=,time=,cmd= -g $(ps -o sid= -p 30085)
27950 pts/36 Ss 00:00:00 -bash
30085 pts/36 S+ 00:00:00 \_ /bin/bash ./loop.sh
31888 pts/36 S+ 00:00:00 \_ sleep 5
불행히도 이것은 screen
각 자식 화면과 모든 손자 bash에 sid를 설정 하기 때문에 작동하지 않습니다 .
프로세스에 의해 생성 된 모든 프로세스를 얻으려면 전체 트리를 빌드해야합니다. 나는 그것을 위해 awk 를 사용 했다. 처음에는 모두를 포함하는 해시 배열을 작성합니다 PID => ,child,child...
. 결국 주어진 프로세스의 모든 자식 프로세스를 추출하기 위해 재귀 함수를 호출합니다. 결과는 다른 ps
형식으로 전달되어 결과 형식이 지정됩니다. 실제 PID는 다음 대신 awk에 대한 인수로 작성해야합니다 <PID>
.
ps --forest $(ps -e --no-header -o pid,ppid|awk -vp=<PID> 'function r(s){print s;s=a[s];while(s){sub(",","",s);t=s;sub(",.*","",t);sub("[0-9]+","",s);r(t)}}{a[$2]=a[$2]","$1}END{r(p)}')
SCREEN 프로세스 (pid = 8041)의 경우 출력 예는 다음과 같습니다.
PID TTY STAT TIME COMMAND
8041 ? Ss 0:00 SCREEN
8042 pts/8 Ss 0:00 \_ /bin/bash
8092 pts/8 T 0:00 \_ vim test_arg test_server
12473 pts/8 T 0:00 \_ vim
12972 pts/8 T 0:00 \_ vim
ps auxf
.