에서 상속받는 모든 프로세스(예: 자식, 손자 등)의 목록을 얻고 싶습니다 $pid
. 이것이 내가 생각해낸 가장 간단한 방법입니다.
pstree -p $pid | tr "\n" " " |sed "s/[^0-9]/ /g" |sed "s/\s\s*/ /g"
전체 목록을 얻는 명령이나 더 쉬운 방법이 있습니까?모두후손 과정?
답변1
다음 명령은 약간 더 간단하며 명령 이름의 숫자를 무시할 수 있다는 추가 이점이 있습니다.
pstree -p $pid | grep -o '([0-9]\+)' | grep -o '[0-9]\+'
또는 Perl을 사용하십시오.
pstree -p $pid | perl -ne 'print "$1\n" while /\((\d+)\)/g'
우리는 괄호 안의 숫자를 찾고 있으므로 그것을 만났을 때 하위 프로세스로 2가 주어지지 않습니다 gif2png(3012)
. 그러나 명령 이름에 대괄호가 포함된 숫자가 포함되어 있으면 모두 실패합니다. 텍스트 처리는 많은 도움이 될 수 있습니다.
그래서 저는 또한 프로세스 그룹이 갈 길이라고 생각합니다. 프로세스를 자체 프로세스 그룹에서 실행하려면 데비안 패키지 "daemontools"의 "pgrphack" 도구를 사용할 수 있습니다:
pgrphack my_command args
아니면 Perl을 다시 사용할 수도 있습니다:
perl -e 'setpgid or die; exec { $ARGV[0] } @ARGV;' my_command args
여기서 주목해야 할 유일한 점은 프로세스 그룹이 중첩되지 않는다는 것입니다. 따라서 프로세스가 자체 프로세스 그룹을 생성하는 경우 해당 하위 프로세스는 더 이상 생성한 그룹에 포함되지 않습니다.
답변2
descendent_pids() {
pids=$(pgrep -P $1)
echo $pids
for pid in $pids; do
descendent_pids $pid
done
}
답변3
정확성 문제도 있다. 출력을 순진하게 구문 분석pstree
여러 가지 이유로 문제가 있습니다.
- pstree 쇼 PID그리고스레드의 ID(이름은 중괄호 안에 표시됨)
- 명령 이름에는 중괄호, 괄호 안에 숫자가 포함되어 안정적인 구문 분석이 불가능할 수 있습니다.
Python이 있고psutil
패키지를 설치한 후 이 코드 조각을 사용하여 모든 하위 프로세스를 나열할 수 있습니다.
pid=2235; python3 -c "import psutil
for c in psutil.Process($pid).children(True):
print(c.pid)"
(예를 들어 psutil 패키지는 tracer
Fedora/CentOS에서 사용할 수 있는 명령에 대한 종속성으로 설치됩니다.)
또는 Bourne 쉘에서 프로세스 트리의 너비 우선 순회를 수행할 수 있습니다.
ps=2235; while [ "$ps" ]; do echo $ps; ps=$(echo $ps | xargs -n1 pgrep -P); \
done | tail -n +2 | tr " " "\n"
pid의 전이적 폐쇄를 계산하려면 꼬리를 생략할 수 있습니다.
위 코드는 재귀를 사용하지 않으며 ksh-88에서도 실행됩니다.
Linux에서는 다음을 제거할 수 있습니다.pgrep
전화해서 다음 정보를 읽어보세요 /proc
.
ps=2235; while [ "$ps" ]; do echo $ps ; \
ps=$(for p in $ps; do cat /proc/$p/task/$p/children; done); done \
| tr " " "\n"' | tail -n +2
이는 각 PID에 대한 분기/실행을 저장하고 pgrep
각 호출에 대해 추가 작업을 수행하기 때문에 더 효율적입니다.
답변4
내가 찾은 가장 짧은 버전은 다음 명령도 올바르게 처리합니다 pop3d
.
pstree -p $pid | perl -ne 's/\((\d+)\)/print " $1"/ge'
명령에 다음과 같은 이상한 이름이 있으면 my(23)prog
잘못 처리됩니다.