【问题标题】:Linux Command to Show Stopped and Running processes?Linux命令显示已停止和正在运行的进程?
【发布时间】: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 process execvp


【解决方案1】:

jobs -slist stoppedSIGTSTP,no SIGSTOP 处理。 The main differenceSIGSTOP 不能忽略。

您可以使用^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 or killall:

pkill -STOP procName
pkill -CONT procName

【讨论】:

    【解决方案2】:

    感谢@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
    

    【讨论】:

      【解决方案3】:

      ps -e 列出所有进程。

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

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

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

      【讨论】:

      • 我必须使用ps,并且我需要确保同时显示正在运行和停止的进程
      • 作业控制及其命令是特定于shell的,没有通用的jobs命令,它是一个shell内置命令。
      • @Vimzy,如果你只需要同时显示正在运行和停止的进程(并且你不需要区分),你可以使用ps -e
      • @JoachimPileborg,这是否意味着 jobs 不能使用 execvp。我没试过运行这个sn-p(因为我确定它会工作,execvp就是这样使用的)
      • -e 无法工作,因为它处理的不是组进程 ID 的一部分
      猜你喜欢
      • 2015-12-31
      • 2022-12-20
      • 2016-11-09
      • 2018-12-10
      • 2012-02-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多