Linux에서 짧은 하위 프로세스의 PID를 얻는 방법을 찾고 있습니다. 인간의 관점에서 볼 때 그 과정은 즉각적입니다. 나는 하위 프로세스를 생성할 상위 프로세스를 알고 있습니다.
특정 상위 프로세스에서 생성된 모든 프로세스에 대한 정보를 기록하는 방법이 있습니까?
나는 아이의 PID를 소급해서 알아내는 방법이 아니라, 그런 일이 발생한 후에 기록하는 방법을 찾고 있습니다.
답변1
감사 시스템을 사용할 수 있습니다.
sudo auditctl -a exit,always -S execve -F ppid="$pid"
$pid
하위 프로세스가 명령을 실행할 때마다 감사 항목이 생성됩니다. audit.log
다음과 같은 것이 있을 것입니다:
type=SYSCALL msg=audit(1373986729.977:377): arch=c000003e syscall=59 success=yes exit=0 a0=7ff000e4b188 a1=7ff000e4b1b0 a2=7fff928d47e8 a3=7fff928caac0 items=2 ppid=7502 pid=691 auid=10031 uid=10031 gid=10031 euid=10031 suid=10031 fsuid=10031 egid=10031 sgid=10031 fsgid=10031 ses=1 tty=pts5 comm="echo" exe="/bin/echo" key=(null)
type=EXECVE msg=audit(1373986729.977:377): argc=2 a0="/bin/echo" a1="test"
type=CWD msg=audit(1373986729.977:377): cwd="/tmp"
type=PATH msg=audit(1373986729.977:377): item=0 name="/bin/echo" inode=131750 dev=fe:00 mode=0100755 ouid=0 ogid=0 rdev=00:00
pid
거기에서 다른 것들을 찾을 수 있습니다 .
특정 작업을 반드시 수행할 필요가 없는 프로세스에 관심이 있는 경우 fork
및 시스템 호출에 대한 clone
감사 규칙을 추가 할 수 있습니다.
답변2
[이 답변은 다음에서 영감을 얻었습니다.ams 컨설팅]
하위 프로세스가 다른 실행 파일(우리는 이를 이라고 부름 foo
)인 경우 쉘 래퍼를 사용해 볼 수 있습니다.
원본 실행 파일의 이름을 바꿉니다.
$ cd \path\to\foo\
$ mv foo foo.moved
래퍼를 다음과 같이 생성합니다 foo
.
#!/bin/sh
\path\to\foo\foo.moved "$@" &
FOO_PID=$!
echo $FOO_PID >\tmp\foo.pid
실행 가능하게 만드세요:
chmod +x foo
다음에 프로그램이 실행될 때 pid를 얻을 수 있습니다 \tmp\foo.pid
.
답변3
쉘 방식
$!
셸에서 명령을 실행하면 Bash 셸의 특수 변수를 사용하여 백그라운드에서 실행 중인 마지막 프로세스의 PID를 찾을 수 있습니다.
예를 들어:
$ sleep 5 &
$ echo $!
8648
또한 프로세스를 백그라운드로 설정하면 프로세스의 PID가 다음과 같이 콘솔을 통해 반환됩니다.
$ sleep 5 &
[1] 8648
또 다른 방법은 다음과 pgrep -P <PPID>
같습니다.
# PID of bash shell
$ echo $$
8376
# run fake job
$ sleep 120 &
[1] 8891
# pgrep PPID
$ pgrep -P 8376
8891
월그린드
하위 PID를 얻으려는 프로그램을 실행하기 전에 다음을 주입할 수 있는 다른 방법이 있습니다.
$ valgrind --trace-children=yes <cmd>
예를 들어:
# sample.bash
#/bin/bash
ls
$ valgrind --trace-children=yes ./sample.bash
...
==17734== possibly lost: 0 bytes in 0 blocks
==17734== still reachable: 33,606 bytes in 95 blocks
==17734== suppressed: 0 bytes in 0 blocks
==17734== Rerun with --leak-check=full to see details of leaked memory
==17734==
==17734== For counts of detected and suppressed errors, rerun with: -v
==17734== ERROR SUMMARY: 0 errors from 0 contexts (suppressed: 6 from 6)
==17733==
==17733== HEAP SUMMARY:
==17733== in use at exit: 36,409 bytes in 879 blocks
...
17733은 PPID이고, PID 17734는 ls
get()을 호출한 하위 PID입니다.
답변4
운영 체제(o/p에 지정되지 않음)가 프로세스 추적을 지원하지 않는 경우 새 프로세스가 새 이미지를 로드한다고 가정하고 하위 이미지를 래퍼로 바꾸는 것을 고려하십시오.