주어진 자식 프로세스의 부모 프로세스 ID를 어떻게 얻습니까?


49

주어진 어린이 pid에서 부모 pid를 얻는 방법?

나는 / proc에서 그것을 수동으로 확인할 수 있다는 것을 알고 있습니다. 우분투에서 이것을 달성 할 수있는 똑똑하고 더 나은 방법이 있는지 궁금합니다. 부모는 살해 당하거나 사망하지 않을 수 있습니다.

감사

답변:


58

명령 줄을 사용하여 자식 프로세스 ID (PID)에서 부모 PID (PPID)를 얻는 방법

사용하다 ps -o ppid=

  • 예를 들어 스크립트 등에서 쉽게 사용할 수있는 ps -o ppid= 2072리턴 은 명령으로 프로세스의 PPID를 제공합니다 . 또한 구식를 사용할 수 있습니다 : .2061ps -o ppid= -C foofoops | grepps -eo ppid,comm | grep '[f]oo'
  • 자세한 설명 : ps -f 2072반품
    UID PID   PPID   C 시간 TTY 상태 시간 명령
    izx 2072   2061   0 07:16? S 0:00 / usr / lib / pulseaudio / pulse / gconf-helper
    
  • pstree관계는 다음과 같습니다 pstree -s -p 2072:
    init (1) ───pulseaudio (2061) ───gconf-helper (2072)
    

줄을 나누지 않고 pstree show 호출 (명령 + 인수)을 만드는 방법을 알고 있습니까? 결과가 한 줄에 쉽게 들어갈 수 있더라도 인수를 추가하면 설치에서 자동으로 줄을 나눕니다. 매뉴얼 페이지가 많은 것으로 보이지만 이유는 없습니다. 내 해결 방법은 pstree에서 PID를 추출 ps -o args ...하고 결과를 사용 하는 것과 관련이 있지만 약간의 냄새가납니다.
John P

나를 놀라게 한 것 : ppid= pid 앞뒤 공간 이 필요한 것 같습니다. 생략하면 다른 결과가 나옵니다.
그레고리 아 레니 우스

8

부모 변수를 얻기 위해 변수 만 사용 :

echo $PPID

이 부모 pid의 명령이 필요한 경우 :

cat /proc/$PPID/comm

전체 명령 행이 필요한 경우 (모든 옵션 포함) :

cat /proc/$PPID/cmdline

설명

  • $PPID 쉘에 의해 정의되며 부모 프로세스의 PID입니다.
  • 에서 /proc/각 프로세스의 PID에 약간의 차이가 있습니다. 그런 다음 cat /proc/$PPID/commPID의 명령 이름을 에코합니다

사람 절차 확인


1
이것이 가장 좋은 대답입니다. procfs는 커널 API입니다. 명령을 실행하고 출력을 구문 분석하는 것은 의미가 없습니다.
Massimo

이것은 또한 잠재적으로 가장 휴대용 PPID그래서 모든 POSIX 호환 쉘이 적절이 설정되어야 POSIX 표준의 한 부분으로 정의된다. pubs.opengroup.org/onlinepubs/9699919799/utilities/…
RobV

2

사용 pstree명령 이름

사용 pstree하면 자식 프로세스 이름으로 검색하고 부모, 조부모 및 자식 프로세스의 모든 자식과 함께 프로세스 ID (PID)를 얻을 수 있습니다.

$ pstree -hp | grep sleep
           |-cron(763)---cron(795)---sh(839)---display-auto-br(841)---sleep(8414)

이 경우 sleep자식 명령이고 PID는 8414입니다. 부모 ID는 841이며이라고 display-auto-brightness합니다. 조부모는 sh프로세스 ID 가 인 쉘 ( )입니다 839. 증조부모 cron의 프로세스 ID는 795입니다. 증조부모도 cron프로세스 ID가입니다 763.

sleep이름 대신 프로세스 ID로 검색 하려면 다음을 사용할 수 있습니다.

$ pstree -hp | grep 14653
           |-cron(763)---cron(795)---sh(839)---display-auto-br(841)---sleep(14653)

통지 sleepID로 변경 과정을 14653. 상위 (PID 841)는 1 분 동안 휴면 한 후 1 초 동안 깨어 난 후 sleep새 프로세스 ID를 가져 오는 새 명령 을 시작합니다 . 이것이 sleep프로세스 ID로 검색하는 것보다 검색이 더 쉬운 또 다른 이유 입니다.

이 코드는 다음과 같습니다. 일출과 일몰을 기준으로 디스플레이 밝기를 자동 조정 하고이 질문에 맞게 조정합니다.


부팅 프로세스로 되돌아가는 중첩 된 체인을 보려면 이름 대신 PID를 사용하십시오.

$ pstree -aps 8541
systemd,1 splash fastboot kaslr
  └─cron,763 -f
      └─cron,795 -f
          └─sh,839 -c    /usr/local/bin/display-auto-brightness
              └─display-auto-br,841 /usr/local/bin/display-auto-brightness
                  └─sleep,8541 60

참고 : 1 분이 더 지나고 sleep 명령은 새로운 PID (8541)를 얻습니다.


귀하의 예에서,이 방법은 PID 807을 사용하는 크론 프로세스에는 효과가 없었습니다.
Olorin

@Olorin 두 예에서 당신은에 grep을 수 807또는 cron과 양산 경우 같은 라인보다 아이들뿐만 아니라 retruned 될 것이다. 그러나 문제는 모든 아이들이 아니라 부모를 찾는 것에 관한 것이었다.
WinEunuuchs2Unix 5

정확히-그 출력으로 PID 807의 부모를 어떻게 찾습니까? 807의 부모가 포함되어 있지 않기 때문에 할 수 없습니다.
Olorin

@Olorin cron의 부모는 PID 인 systemd입니다 1. PID 1을 죽일 수 있다고 생각하지 않습니다.
WinEunuuchs2Unix

나는 아무것도 죽이는 것에 대해 아무 말도하지 않았다. 명확히하기 위해, 이제 pstree의 첫 번째 줄을 가져 가거나 명령 이름을 grepping하면 항상 부모 PID를 줄 것이라고 주장하고 있습니까?
Olorin

0

ps -efj 같은 용도로도 사용할 수 있습니다.

예를 들어

> ps -efj | head
UID        PID  PPID  PGID   SID  C STIME TTY          TIME CMD
root         1     0     1     1  0 Jul01 ?        00:00:13 /sbin/init splash
root         2     0     0     0  0 Jul01 ?        00:00:00 [kthreadd]
root         3     2     0     0  0 Jul01 ?        00:00:02 [ksoftirqd/0]
root         5     2     0     0  0 Jul01 ?        00:00:00 [kworker/0:0H]
root         7     2     0     0  0 Jul01 ?        00:06:44 [rcu_sched]
root         8     2     0     0  0 Jul01 ?        00:00:00 [rcu_bh]
root         9     2     0     0  0 Jul01 ?        00:00:00 [migration/0]
root        10     2     0     0  0 Jul01 ?        00:00:08 [watchdog/0]
root        11     2     0     0  0 Jul01 ?        00:00:08 [watchdog/1]
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.