프로세스와 그 자식/손자를 죽이는 코드가 있습니다. 이 코드를 테스트하고 싶습니다.
현재 내가 하고 있는 일은 $ 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
이 작업을 정확하게 수행하는 프로그램이 포함된 패키지가 있습니다 .