Linux命令显示已停止和正在运行的进程?

时间:2015-09-30 06:43:54

标签: c linux process execvp

我目前正在我的一个c程序中执行以下Linux命令来显示正在运行的进程。无论如何我可以修改它以显示已停止的进程和正在运行的进程吗?

char *const parmList[] = {"ps","-o","pid,ppid,time","-g","-r",groupProcessID,NULL};
execvp("/bin/ps", parmList);

3 个答案:

答案 0 :(得分:2)

jobs -s列表流程已由SIGTSTP, no SIGSTOP停止。 The main difference SIGSTOP不能忽略。

我可以SIGTSTP使用^Z进行处理,也可以使用kill -TSTP thepid从其他shell进行处理,然后使用jobs进行列表。

但是列出收到 SIGSTOP 的PID呢? One way得到这个是

 ps -e -o stat,command,pid | grep '^S '

我发现这两个非常有用,可以暂停/延续一段时间(通常是浏览器):

kill -STOP $(pgrep procname)
kill -CONT $(pgrep procname)

答案 1 :(得分:0)

ps -e列出了所有流程。

jobs列出当前停止或后台停止的所有进程。

因此,您可以使用jobs运行execvp命令:

char *arg = {"jobs", NULL};
execvp(arg[0], arg);

答案 2 :(得分:0)

感谢@pablo-bianchi,他给了我 oompff(起点)来查找 SIGSTOP'd 和 SIGTSTP'd 进程,但是他的回答并不完全正确。

Pablo 的命令应该使用 T 而不是 S

$ ps -e -o stat,command,pid | grep '^T '
T    /bin/rm -r 2021-07-23_22-00 1277441
T    pyt 999                     1290977
$ ps -e -o stat,command,pid | grep '^S ' | wc -l
153
$

来自man ps

PROCESS STATE CODES
       Here are the different values that the s, stat and state output specifiers (header "STAT"
       or "S") will display to describe the state of a process:

               D    uninterruptible sleep (usually IO)
               I    Idle kernel thread
               R    running or runnable (on run queue)
               S    interruptible sleep (waiting for an event to complete)
               T    stopped by job control signal
               t    stopped by debugger during the tracing
               W    paging (not valid since the 2.6.xx kernel)
               X    dead (should never be seen)
               Z    defunct ("zombie") process, terminated but not reaped by its parent

WRT pgrep,它是一个真正的grep,参数不是程序名;相反,它是一个正则表达式应用于 /proc//cmdline 中的第一项(通常来自执行命令行(或 execve())的名称)。

因此,如果您试图杀死 pyt,您会意外地同时杀死所有正在运行的 Python 程序:

$ pgrep -a pyt
7228 python3 /home/wwalker/bin/i3-alt-tab-ww --debug
1290977 pyt 999

您需要“锚定”正则表达式:

$ pgrep -a '^pyt$'
1290977 pyt 999