현재 사용자의 프로세스 상위 항목을 보고 출력 형식을 지정합니다.

현재 사용자의 프로세스 상위 항목을 보고 출력 형식을 지정합니다.

모든 프로세스를 보는 데 사용하고 있습니다 ps -eo ppid,pid,cmd. 아래와 같이 출력 형식을 지정하려면 어떻게 해야 합니까?

주어진 PID와 그 상위 항목만 인쇄됩니다(초기화될 때까지).

23464   current
  |
23211   bash
  |
23210   sshd: xxW
  |
23193   sshd: WWcccv
  |
 728    /usr/sbin/sshd –D
  |
  1     init

pstree가능하다면 PID를 사용하지 않고 PID를 사용하여 상위 프로세스를 보는 스크립트를 작성 중입니다 .

답변1

어쩌면 다음과 같은 것일 수도 있습니다.

#! /bin/bash -
pid=${1?Please give a pid}
sep=
while
  [ "$pid" -gt 0 ] &&
    read -r ppid name < <(ps -o ppid= -o args= -p "$pid")
do
  printf "$sep%$((3+${#pid}/2))d%$((4-${#pid}/2))s%s\n" "$pid" "" "$name"
  sep=$'  |\n'
  pid=$ppid
done

이것은 만든다:

$ that-script "$$"
13612  /bin/zsh
  |
 4137  SCREEN screen -xRS main
  |
 4136  screen screen -xRS main
  |
 4130  zsh
  |
 4128  xterm
  |
  1    /sbin/init splash

ps조상에서 프로세스당 하나씩 실행되므로 약간 느립니다 . ps한 번 실행하여 모든 정보를 검색하고 사후 처리함으로써 이를 개선 할 수 있습니다 awk. 예를 들면 다음과 같습니다.

#! /bin/sh -
pid=${1?Please give a pid}
ps -Ao pid= -o ppid= -o args= |
  awk -v p="$pid" '
    {
      pid = $1; ppid[pid] = $2
      sub(/([[:space:]]*[[:digit:]]+){2}[[:space:]]*/, "")
      args[pid] = $0
    }
    END {
      while (p) {
        printf "%s%*d%*s%s\n", sep, 3+length(p)/2, p, 4-length(p)/2, "", args[p]
        p = ppid[p]
        sep = "  |\n"
      }
    }'

답변2

pstree -spa를 사용하는 것은 어떻습니까? pid 및 명령줄을 포함하여 특정 pid의 이전 항목과 조상을 표시합니다.

$ pstree -spa 3056
systemd,1
  └─upowerd,3056
      ├─{gdbus},3071
      └─{gmain},3069

답변3

pid와 ppid를 배열에 넣습니다. 재귀 함수 또는 배열을 통한 루프로 필요한 pid 및 ppid 항목만 인쇄합니다.

관련 정보