저는 bash 스크립트용 래퍼 애플리케이션을 작성 중이며 애플리케이션이 사용자 스크립트에서 시작된 도구/프로세스를 추적하기를 원합니다. 생성된 하위 프로세스 목록을 결정하는 가장 좋은 방법이 무엇인지 알고 싶습니다.이것부모 프로세스.
나는 노력했다
- 정기적으로 전화함메모명령을 실행하고 프로세스 트리를 빌드하지만(예: ps -ejH) 빠르게 완료될 때까지 실행되는 프로세스가 누락됩니다.
- 다음과 같은 도구를 사용하세요.여우탑proc 커넥터 인터페이스를 사용하지만 높은 권한으로만 실행할 수 있습니다. 이것이 올바른 데이터를 제공하지만 내 경우에는 sudo로 실행이 작동하지 않습니까?
이를 달성하는 방법에 대한 제안이 있으십니까?
답변1
strace
Linux를 사용하는 경우 프로세스에서 사용하는 시스템 호출을 추적하는 데 사용할 수 있습니다 . 예를 들어:
~ strace -e fork,vfork,clone,execve -fb execve -o log ./foo.sh
foo bar
~ cat log
4817 execve("./foo.sh", ["./foo.sh"], [/* 42 vars */]) = 0
4817 clone(child_stack=NULL, flags=CLONE_CHILD_CLEARTID|CLONE_CHILD_SETTID|SIGCHLD, child_tidptr=0x7f1bb563b9d0) = 4818
4818 execve("/bin/true", ["/bin/true"], [/* 42 vars */] <detached ...>
4817 --- SIGCHLD {si_signo=SIGCHLD, si_code=CLD_EXITED, si_pid=4818, si_uid=1000, si_status=0, si_utime=0, si_stime=0} ---
4817 clone(child_stack=NULL, flags=CLONE_CHILD_CLEARTID|CLONE_CHILD_SETTID|SIGCHLD, child_tidptr=0x7f1bb563b9d0) = 4819
4817 clone(child_stack=NULL, flags=CLONE_CHILD_CLEARTID|CLONE_CHILD_SETTID|SIGCHLD, child_tidptr=0x7f1bb563b9d0) = 4820
4820 execve("/bin/echo", ["/bin/echo", "foo", "bar"], [/* 42 vars */] <detached ...>
4817 --- SIGCHLD {si_signo=SIGCHLD, si_code=CLD_EXITED, si_pid=4820, si_uid=1000, si_status=0, si_utime=0, si_stime=0} ---
4817 +++ exited with 0 +++
4819 execve("/bin/sleep", ["sleep", "1"], [/* 42 vars */] <detached ...>
스크립트가 시스템 호출을 사용하여 세 개의 프로세스(PID 4818, 4819, 4820)를 분기 clone(2)
하고 execve(2)
이러한 분기된 프로세스의 시스템 호출이 실행된 명령을 표시하는 것을 볼 수 있습니다.
-e fork,vfork,clone,execve
추적 출력을 이러한 시스템 호출로 제한-f
자식 프로세스를 따르다-b execve
도달하면 프로세스에서 분리되므로execve
하위 프로세스에 대한 더 이상 추적이 표시되지 않습니다.
답변2
pstree -p `pgrep NetworkManager`
NetworkManager(1638)─┬─dhclient(3594)
├─{NetworkManager}(1645)
├─{NetworkManager}(1647)
└─{NetworkManager}(7363)
나는 이것이 당신이 찾고 있는 것이라고 생각합니다.
직접 pid 또는 pgrep 및 프로세스 이름을 사용하십시오.
-p는 하위 프로세스의 pid를 인쇄하는 데 사용됩니다.
답변3
패키지명령이 도움이 될 것입니다. 다음 명령을 사용하십시오.
process()에서 분기된 각 프로세스의 PID를 인쇄합니다 $pid
.
pgrep -P $pid
분기된 각 프로세스에 대한 자세한 내용을 보려면 다음 명령을 사용하세요.
ps -fp `pgrep -P $pid`
$pid
프로세스 ID는 어디에 있습니까?
답변4
이 상위 프로세스에 의해 생성된 하위 프로세스 목록을 결정하는 가장 좋은 방법이 무엇인지 궁금합니다.
bash에서 작성했다고 가정합니다(말하지 않았습니다). 그런 다음 작업 제어를 사용할 수 있습니다. 이 기능은 스크립트를 실행할 때 기본적으로 꺼져 있습니다.
Bash 매뉴얼은 다음과 같이 말합니다:
[--abefhkmnptuvxBCHP] [-o 옵션] [arg ...]
...
-m 모니터 모드를 설정합니다.
작업 제어가 활성화되었습니다. 이 옵션은 이를 지원하는 시스템의 대화형 셸에 대해 기본적으로 활성화되어 있습니다(위의 작업 제어 참조). 백그라운드 프로세스는 별도의 프로세스 그룹에서 실행되며 완료되면 종료 상태가 포함된 줄을 인쇄합니다.
따라서 스크립트에 추가하면 set -m
start 명령을 사용한 command &
다음 을 사용하여 jobs
작업을 나열할 수 있습니다.