Process

如何僅列出非 <defunct> 程序?

  • February 3, 2021

是否有命令行選項的組合pspgrep其他相對直接的方式來確定特定程序名稱是否實際正在執行(可用於正常使用)..

通過“執行”,我的意思是明確排除程序&lt;defunct&gt;或任何其他非執行程序(例如殭屍:)……

此範例腳本顯示了一個&lt;defunct&gt;項目範例:

#!/bin/bash   ubuntu 10.04

 pgrep ^gnuserv$
# 25591
# 25599
# 27330

 ps $(pgrep ^gnuserv$)  # command ammended as per pilcrow's good suggestion
#   PID TTY      STAT   TIME COMMAND
# 25591 ?        Zs     0:00 [gnuserv] &lt;defunct&gt;
# 25599 ?        Zs     0:00 [gnuserv] &lt;defunct&gt;
# 27330 pts/2    S+     0:00 gnuserv

我可以進一步sed輸出,但我認為/希望有更直接的方法……

在您的評論中,您澄清:

我實際上正在尋找 ps 或 pgrep (或類似)的單步選項,它只輸出“活動”程序……

恐怕您對目前的 ps/pgrep 實現不走運。

像這樣的後期過濾依賴於對初始輸出的全面理解,而我沒有……

但是您可以獲得這種理解,並且更好的是,根據需要控制該輸出。嘗試這樣的事情:

function pgrep_live {
 pids=$(pgrep "$1");
 [ "$pids" ] || return;
 ps -o s= -o pid= $pids | sed -n 's/^[^ZT][[:space:]]\+//p';
}

這將返回與您的輸入字元串匹配的任何 pgrep 程序的 pid,這些程序*“可用於正常使用”*,即既不是 dead+unreaped ( Z ) 也不是已停止 ( T )。

引用自:https://unix.stackexchange.com/questions/13622