프로세스 트리를 만드는 방법은 무엇입니까?

프로세스 트리를 만드는 방법은 무엇입니까?

프로세스와 그 자식/손자를 죽이는 코드가 있습니다. 이 코드를 테스트하고 싶습니다.

현재 내가 하고 있는 일은 $ watch date > date.txt자식과 함께 프로세스를 만드는 것입니다.

만들 수 있는 방법이 있나요?아버지->아들->손자나무? 이것을 달성할 수 있는 명령은 무엇입니까?

답변1

#!/bin/sh
#This is a process with an id of $$

( sleep 1000 )&               #this creates an idle child
( (sleep 1000)& sleep 1000 )& #this creates an idle child and grandchild
wait                          #this waits for direct children to finish

내 시스템에서 위 명령을 실행하면 ./1.sh &다음 프로세스 트리가 생성됩니다.

$ command ps -o pid,ppid,pgrp,stat,args,wchan --forest
  PID  PPID  PGRP STAT COMMAND                     WCHAN
24949  4783 24949 Ss   /bin/bash                   wait
25153 24949 25153 S     \_ /bin/sh ./1.sh          sigsuspend
25155 25153 25153 S     |   \_ sleep 1000          hrtimer_nanosleep
25156 25153 25153 S     |   \_ sleep 1000          hrtimer_nanosleep
25158 25156 25153 S     |       \_ sleep 1000      hrtimer_nanosleep

트리에는 동일한 프로세스 그룹(PGRP)의 25153과 관련이 있습니다.PID첫 번째 프로세스 중. 대화형 모드에서 새 명령을 시작할 때마다(또는 작업 제어를 명시적으로 켤 때마다) 쉘은 프로세스 그룹을 생성합니다.

이것PGRP이 메커니즘을 통해 쉘은 경쟁 조건을 생성하지 않고 전체 프로세스 그룹에 한 번에 신호를 보낼 수 있습니다. 이는 스크립트가 실행되고 포그라운드 작업이 다음을 보내는 데 사용될 때 작업 제어에 사용됩니다.

  • (시그(SIG))INTR 사용자가 CC를 눌렀을 때
  • (시그(SIG))사직하다 사용자가 C-\를 누르면
  • (시그(SIG))기차를 통해사용자가 CZ를 누르면

예를 들어 다음과 같이 동일한 작업을 수행할 수 있습니다.

kill -INTR -25153 

어디INTR는 신호이고 25153은 신호가 전송되는 프로세스 그룹입니다. -25153 이전은 목표가 다음과 같다는 뜻입니다.PGRP대신에 이드PID.

귀하의 경우 보내야 할 신호는 -TERM(종료 요청)입니다. 용어는 신호의 기본값 kill이지만 대상이 그룹이 아닌 그룹인 경우 명시적으로 지정해야 합니다.PID.

kill -TERM -25153

마지막으로 시작한 백그라운드 작업의 프로세스 그룹을 종료하려면 다음을 수행하십시오.

kill -TERM -$!

답변2

쉘 호출 추가

sh -c "watch date > date.txt"

더 많은 레벨을 얻으려면 주위에 더 많은 껍질을 추가하십시오.

답변3

재귀 스크립트를 만들 수 있습니다. 예를 들어 파일에서/tmp/run

#!/bin/bash
depth=${1:-3}
f(){
 let depth--
 if [ $depth -gt 0 ]
 then $0 $depth
 else sleep 999
 fi
}
f

그럼 chmod +x /tmp/run하세요 /tmp/run 3.

답변4

freebsd의 명령이 ps프로세스 트리를 생성할 수 없는 것 같습니다. 다행히도 pstree이 작업을 정확하게 수행하는 프로그램이 포함된 패키지가 있습니다 .

관련 정보