2014-01-24 59 views
3

所以我試圖獲得我目前正在運行一個程序的所有目錄的列表,所以我可以跟蹤我目前正在運行的衆多作業。奇怪的b​​ash行爲

當我單獨運行的命令,他們似乎都工作,但是當我把它們結合在一起,事情錯了......(ll只是普通ls -l別名)

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

爲什麼當我在for循環內有ll /proc/31353/fd時,它無法訪問該文件,但是當我通常使用它時它工作正常?

並通過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 hunchtop的輸出是爲人類設計的,而不是用於解析。 hexdump顯示top正在生成一些終端轉義序列。這些轉義序列是該行第一個字段的一部分,因此生成的文件名稱與/proc/\e(B\e[m\e(B\e[m21353/pid而不是/proc/21353/pid類似,其中\e是轉義字符。

改爲使用ps,pgreppidof。在Linux下,您可以使用-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

很好的答案。我意識到top是一個內在的互動程序,但我仍然感到驚訝,它不會在管道中表現得更好。 –

+0

@JohnKugelman它讓我感到驚訝 - 特別是當我沒有在交互模式下使用它時... – will

+0

@will我以爲你使用'top'按CPU使用率排序;如果你不是,你不需要通過'sort'和'awk'(我錯誤的建議'剪切',因爲這些字段不是製表符分隔的)。 – 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