ps와 pwdx를 동시에 사용하는 방법은 무엇입니까?

ps와 pwdx를 동시에 사용하는 방법은 무엇입니까?

Top서버에서 무슨 일이 일어나고 있는지 확인하는 데 사용할 수 있는 명령이 있습니다 .

ps -eo pid,cmd:50,%mem,%cpu --sort=-%mem | head 20

ps기본적으로 여러 열을 사용 하고 제거합니다.

pwdx각 프로세스 ID에 대해 소스 디렉터리가 어디에 있는지 확인하는 데 사용할 수 있습니다 .

그러나 pwdx위 명령의 출력을 결합하여 열로 추가하는 데 문제가 있습니다.

도울 수 있니?

답변1

psprocps에 및 pwdx명령이 포함되어 있지만 이를 제공하지 않는 것이 이상합니다 ps -o cwd.

Linux에서( ps어차피 명령 호출은 이미 Linux 전용(procps)임) 프로세스 의 c현재 작업 w디렉터리를 가져오는 것은 다음과 같이 하면 됩니다.dreadlink("/proc/<pid>/cwd")

ps -eo pid,cmd:50,%mem,%cpu --sort=-%mem |
  perl -lane 'print "$_ " . ($. == 1 ? "CWD" : readlink("/proc/$F[0]/cwd"));
              exit if $. == 20'

필요하지 않습니다 pwdx(또는 head).

답변2

한 가지 방법은 AWK를 사용하여 각 PID를 추출하고 pwdx실행하여 출력을 병합하는 것입니다.

ps -eo pid,cmd:50,%mem,%cpu --sort=-%mem | head -n 20 |
awk 'NR == 1 { print $0 " CWD" };
     NR > 1 {
       printf "%s", $0;
       cmd = "exec pwdx " $1 " 2>&1"
       cmd | getline
       close(cmd)
       for (i = 2; i <= NF; i++)
         printf " %s", $i;
       printf "\n"
     }'

이렇게 하면 첫 번째 줄과 모든 후속 줄에 "CWD" 헤더가 추가됩니다.

  • 현재 라인을 출력합니다(의 출력 ps).
  • 현재 pid에서 실행 pwdx하고 출력(오류 포함)을 $0;
  • 첫 번째 필드 이후의 모든 필드를 출력합니다(pid 반복).
  • 줄을 끝내십시오.

구문 분석된 출력에 오류를 포함하면 pwdx전체 출력이 복잡해지지 않고 해당 프로세스의 현재 디렉터리 대신 오류가 표시됩니다(일반적으로 현재 사용자가 정보를 읽을 수 없는 프로세스의 경우 "권한이 거부됨"). .

이는 각 프로세스에 대해 쉘을 생성하므로 특별히 효율적이지는 않지만 pwdx살펴볼 프로세스가 최대 19개이므로 눈에 띄지 않습니다.Stéphane Chazelas의 Perl 기반 답변더 효율적이고 더 짧습니다.

관련 정보