如何仅列出非流程?

如何仅列出非流程?

是否有命令行选项的组合pspgrep或其他一些相对直接的方法来确定特定进程名称是否实际正在运行(可用于正常使用)..

通过“运行”,我的意思是专门排除正在运行的进程<defunct>或任何其他非运行进程(例如僵尸:)...

此示例脚本显示了项目示例<defunct>

#!/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] <defunct>
# 25599 ?        Zs     0:00 [gnuserv] <defunct>
# 27330 pts/2    S+     0:00 gnuserv

我可以进一步sed输出,但我认为/希望有一种更直接的方法......

答案1

在您的评论中您澄清:

我实际上正在寻找 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,这些进程是“可以正常使用,”也就是说,既没有死+未收割(Z)也没有停止(时间)。

答案2

您可以尝试使用 grep 的 -v 选项来否定正则表达式,如下所示:

for p in $(pgrep ^gnuserv$) ;do ps x |grep "^\s*$p" | grep -v \<defunct\> ;done

答案3

## bash

## function to check if a process is alive and running:

_isRunning() {
    ps -o comm= -C "$1" 2>/dev/null | grep -x "$1" >/dev/null 2>&1
}

## example 1: checking if "gedit" is running

if _isRunning gedit; then
    echo "gedit is running"
else
    echo "gedit is not running"
fi

## example 2: start lxpanel if it is not there

if ! _isRunning lxpanel; then
    lxpanel &
fi

## or

_isRunning lxpanel || (lxpanel &)

笔记pgrep -x lxpanel或者即使已失效(僵尸),pidof lxpanel仍然报告正在运行;lxpanel因此,为了获得活跃且正在运行的进程,我们需要使用psgrep

答案4

列出命令行与字符串匹配的进程:

livepgrep(){ ps o state=,pid=,command=|sed -E -n "/ sed -E -n/d;/^[^ZT] +[0-9]+ .*$@/p"; }
              ^ ^   ^      ^      ^      ^  ^         ^            ^      ^        ^
              | |   |      |      |      |  |         |            |      |        |
processes ----+ |   |      |      |      |  |         |            |      |        |
output format --+   |      |      |      |  |         |            |      |        |
process state ------+      |      |      |  |         |            |      |        |
pid -----------------------+      |      |  |         |            |      |        |
full command line ----------------+      |  |         |            |      |        |
sed as the filter -----------------------+  |         |            |      |        |
use extended regex -------------------------+         |            |      |        |
exclude sed from search results ----------------------+            |      |        |
state != Z (zombie, defunct) != T (stopped) -----------------------+      |        |
pid ----------------------------------------------------------------------+        |
string to search in the command line ----------------------------------------------+

例子:

$ livepgrep tint2
S   493 tint2
$ livepgrep python
S   525 /usr/bin/python /bin/udiskie -C -F -s
S   580 python2 /home/xxx/bin/twmcpuram

相关内容