我目前正在我的一个c程序中执行以下Linux命令来显示正在运行的进程。无论如何我可以修改它以显示已停止的进程和正在运行的进程吗?
char *const parmList[] = {"ps","-o","pid,ppid,time","-g","-r",groupProcessID,NULL};
execvp("/bin/ps", parmList);
答案 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