【发布时间】:2015-09-30 06:43:53
【问题描述】:
我目前正在我的一个 c 程序中执行以下 Linux 命令以显示正在运行的进程。无论如何我可以修改它以显示停止的进程和正在运行的进程吗?
char *const parmList[] = {"ps","-o","pid,ppid,time","-g","-r",groupProcessID,NULL};
execvp("/bin/ps", parmList);
【问题讨论】:
我目前正在我的一个 c 程序中执行以下 Linux 命令以显示正在运行的进程。无论如何我可以修改它以显示停止的进程和正在运行的进程吗?
char *const parmList[] = {"ps","-o","pid,ppid,time","-g","-r",groupProcessID,NULL};
execvp("/bin/ps", parmList);
【问题讨论】:
jobs -slist stopped 由SIGTSTP,no SIGSTOP 处理。 The main difference 是SIGSTOP 不能忽略。
您可以使用^Z 或从其他shell 使用kill -TSTP PROC_PID(或使用pkill,见下文)SIGTSTP 一个进程,然后使用jobs 列出它们。
但是那些收到 SIGSTOP 的列表 PID 呢? One way 得到这个是
ps -e -o stat,command,pid | grep '^S '
我发现这两个对于停止/继续某个进程(通常是浏览器)非常有用:
kill -STOP $(pgrep procName)
kill -CONT $(pgrep procName)
pkill -STOP procName
pkill -CONT procName
【讨论】:
感谢@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
【讨论】:
ps -e 列出所有进程。
jobs列出所有当前停止或在后台的进程。
因此,您可以使用execvp 运行jobs 命令:
char *arg = {"jobs", NULL};
execvp(arg[0], arg);
【讨论】:
jobs命令,它是一个shell内置命令。
ps -e。
jobs 不能使用 execvp。我没试过运行这个sn-p(因为我确定它会工作,execvp就是这样使用的)