2014-01-24 1 views
3

현재 프로그램을 실행하고있는 모든 디렉토리의 목록을 얻으려고하므로 현재 실행중인 수많은 작업을 추적 할 수 있습니다. 내가 개별적으로 명령을 실행하면이상한 bash 동작

, 그들은 모두 작동하는 것,하지만 난 그들을 함께 체인 때, 뭔가

for pid in `top -n 1 -u will | grep -iP "(programs|to|match)" | awk '{print $1}'`; 
    do 
    ll /proc/$pid/fd | head -n 2 | tail -n 1; 
done 

enter image description here

( ll 그냥 일반 ls -l 별칭입니다) ... 잘못된 것입니다

ll /proc/31353/fd이 루프 내에 있습니까? for 루프는 파일에 액세스 할 수 없지만 정상적으로 사용할 때 제대로 작동합니까?

그리고

hexdump -C을 통해 파이프 :이 같은

$ top -n 1 -u will | 
    grep -iP "(scatci|congen|denprop|swmol3|sword|swedmos|swtrmo)" | 
     awk '{print $1}' | hexdump -C 
00000000 1b 28 42 1b 5b 6d 1b 28 42 1b 5b 6d 32 31 33 35 |.(B.[m.(B.[m2135| 
00000010 33 0a 1b 28 42 1b 5b 6d 1b 28 42 1b 5b 6d 32 39 |3..(B.[m.(B.[m29| 
00000020 33 33 31 0a 1b 28 42 1b 5b 6d 1b 28 42 1b 5b 6d |331..(B.[m.(B.[m| 
00000030 33 30 39 39 36 0a 1b 28 42 1b 5b 6d 1b 28 42 1b |30996..(B.[m.(B.| 
00000040 5b 6d 32 36 37 31 38 0a       |[m26718.| 
00000048 
+0

'ls -l "/ proc/$ pid/fd"'를 시도 했습니까? – anubhava

+0

@anubhava, 예, 아무런 차이가 없습니다. – will

+0

오류가 있습니까? 아니면 출력이 없습니까? – anubhava

답변

4

chepner had the right hunch을. top의 출력은 인간을 위해 설계된 것이지 구문 분석을위한 것이 아닙니다. hexdump는 top이 일부 터미널 이스케이프 시퀀스를 생성하고 있음을 보여줍니다. 이러한 이스케이프 시퀀스는 줄의 첫 번째 필드의 일부이므로 결과 파일 이름은 /proc/21353/pid 대신 /proc/\e(B\e[m\e(B\e[m21353/pid이고 \e은 이스케이프 문자입니다.

ps, pgrep 또는 pidof을 대신 사용하십시오. 리눅스에서는 -C 옵션을 ps으로 사용하여 정확한 프로그램 이름과 일치시킬 수 있습니다 (여러 이름을 허용하는 옵션 반복). 디스플레이 형식을 제어하려면 -o 옵션을 사용하십시오.

for pid in $(ps -o pid= -C scatci -C congen -C denprop -C swmol3 -C sword -C swedmos -C swtrmo); do 
    ls -l /proc/$pid/fd | head -n 2 | tail -n 1 
done 

는 CPU 사용량 감소를 기준으로 정렬하려면 :

for pid in $(ps -o %cpu=,pid= \ 
       -C scatci -C congen -C denprop -C swmol3 -C sword -C swedmos -C swtrmo | 
      sort -k 1gr | 
      awk '{print $2}'); do 

enter image description here

은 또한, 대신 명령 치환을위한 달러 괄호의 사용 역 따옴표 - 역 따옴표 안에 따옴표 변태 다소 행동을하고, 거기에서 실수를하는 것은 쉽습니다. 달러 괄호 안에 인용하는 것은 직관적입니다.

+0

좋은 답변입니다.꼭대기가 본질적으로 상호 작용하는 프로그램이라는 것을 알지만, 나는 파이프 라인에서 행동하는 것이 더 좋지 않다는 사실에 여전히 놀랐다. –

+0

@JohnKugelman 놀랍습니다. 특히 인터랙티브 모드에서 사용하지 않을 때는 ... – will

+0

@will은 CPU 사용량별로 정렬하려면'top'을 사용한다고 생각합니다. 그렇지 않다면'sort '와'awk'를 파이프 할 필요가 없습니다 (필드가 탭으로 구분되어 있지 않기 때문에'cut '을 제안하는 것은 잘못되었습니다). – Gilles

-2

대신 "AWK"의 "컷"사용하려고 뭔가 :

for pid in `top -n 1 -u will | grep -iP "(scatci|congen|denprop|swmol3|sword|swedmos|swtrmo)" | sed 's///g' | cut -d ' ' -f2`; do echo /proc/$pid/fd | head -n 2 | tail -n 1; done 
+1

왜? 차이점이 뭐야? –

+0

"top"출력 라인의 시작 부분에 때로는 공간이있는 상황이 실제로 더 잘 처리되지만 근본적인 문제는 해결되지 않습니다. – will

+0

awk가 읽지 않은 문자를 넣습니다. – rubens