![ps와 pwdx를 동시에 사용하는 방법은 무엇입니까?](https://linux55.com/image/226180/ps%EC%99%80%20pwdx%EB%A5%BC%20%EB%8F%99%EC%8B%9C%EC%97%90%20%EC%82%AC%EC%9A%A9%ED%95%98%EB%8A%94%20%EB%B0%A9%EB%B2%95%EC%9D%80%20%EB%AC%B4%EC%97%87%EC%9E%85%EB%8B%88%EA%B9%8C%3F.png)
Top
서버에서 무슨 일이 일어나고 있는지 확인하는 데 사용할 수 있는 명령이 있습니다 .
ps -eo pid,cmd:50,%mem,%cpu --sort=-%mem | head 20
ps
기본적으로 여러 열을 사용 하고 제거합니다.
pwdx
각 프로세스 ID에 대해 소스 디렉터리가 어디에 있는지 확인하는 데 사용할 수 있습니다 .
그러나 pwdx
위 명령의 출력을 결합하여 열로 추가하는 데 문제가 있습니다.
도울 수 있니?
답변1
ps
procps에 및 pwdx
명령이 포함되어 있지만 이를 제공하지 않는 것이 이상합니다 ps -o cwd
.
Linux에서( ps
어차피 명령 호출은 이미 Linux 전용(procps)임) 프로세스 의 c
현재 작업 w
디렉터리를 가져오는 것은 다음과 같이 하면 됩니다.d
readlink("/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 기반 답변더 효율적이고 더 짧습니다.