大家好,
我正在嘗試編寫一個bash腳本來顯示java的所有進程,但是我希望它以下面的方式顯示。
ps -p $PID -o pid,vsz=MEMORY -o user,group=GROUP -o comm,args=ARGS
上面的問題是它只顯示一個特定的 PID。
所以我想ps aux|grep j\[a\]va
取得每個PID,然後在上面的命令中執行每個PID。
結果:
root@reinhardt-VirtualBox:/home/reinhardt# ps -p 1959 -o pid,vsz=MEMORY -o user,group=GROUP -o comm,args=ARGS
PID MEMORY USER GROUP COMMAND ARGS
1959 13648 root root grep grep --color=auto java
我猜想會像 for 迴圈一樣進行某種迴圈?
答案1
不在我可以測試的地方,但這應該有效。 read
是 shell 腳本的標準部分,它將來自 stdin 的內容(可以是流,也可以是 /dev/tty 等裝置)放入變數中。然後你只需做一個 while 循環
ps auwwx | gawk '/[j]ava/{print $1}' | while read PID
do
ps -p $PID -o pid,vsz=MEMORY -o user,group=GROUP -o comm,args=ARGS
done
或者更簡單地說,如果您的 UNIX 有 pgrep:
pgrep java | while read PID
do
ps -p $PID -o pid,vsz=MEMORY -o user,group=GROUP -o comm,args=ARGS
done
有時您可以xargs
在此類情況下使用。請記住,預設情況下,xargs 將一組參數放在命令末尾。因此,您需要一次向其提供一個(使用 -n1),並使用 -i 將 PID 放置在您想要的位置:
pgrep java | xargs -n1 -i{} ps -p {} -o pid,vsz=MEMORY -o user,group=GROUP -o comm,args=ARGS
(再次,如果我的 -i 語法錯誤,我深表歉意,我現在無法測試。如果出現問題,請檢查線上說明頁面)