현재 실행 중인 프로세스에서 분기된 프로세스 목록을 얻으시겠습니까?

현재 실행 중인 프로세스에서 분기된 프로세스 목록을 얻으시겠습니까?

저는 bash 스크립트용 래퍼 애플리케이션을 작성 중이며 애플리케이션이 사용자 스크립트에서 시작된 도구/프로세스를 추적하기를 원합니다. 생성된 하위 프로세스 목록을 결정하는 가장 좋은 방법이 무엇인지 알고 싶습니다.이것부모 프로세스.

나는 노력했다

  1. 정기적으로 전화함메모명령을 실행하고 프로세스 트리를 빌드하지만(예: ps -ejH) 빠르게 완료될 때까지 실행되는 프로세스가 누락됩니다.
  2. 다음과 같은 도구를 사용하세요.여우탑proc 커넥터 인터페이스를 사용하지만 높은 권한으로만 실행할 수 있습니다. 이것이 올바른 데이터를 제공하지만 내 경우에는 sudo로 실행이 작동하지 않습니까?

이를 달성하는 방법에 대한 제안이 있으십니까?

답변1

straceLinux를 사용하는 경우 프로세스에서 사용하는 시스템 호출을 추적하는 데 사용할 수 있습니다 . 예를 들어:

~ 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 -mstart 명령을 사용한 command &다음 을 사용하여 jobs작업을 나열할 수 있습니다.

관련 정보