【问题标题】:How to list all background pids in bash如何在bash中列出所有背景pid
【发布时间】:2013-09-22 22:44:37
【问题描述】:

要么我无法正确地表达我的搜索,要么答案不容易找到!但我试图弄清楚如何列出我所有的后台任务 PID。例如:

到目前为止,我发现要列出我们使用的最后一个 PID:

$!

但现在我想在此之前列出任务的 PID(如果存在的话),但我找不到如何做到这一点。最后,我想列出我所有的后台任务 PID。

我知道我们还可以通过以下方式找到最后一个工作 ID:

%% (last job in list)
%1 (first job in list)
%2 (second job in list)

但是对于进程 ID 似乎不起作用?

谢谢大家:)

【问题讨论】:

    标签: bash background pid


    【解决方案1】:

    使用ps S。例如:

    $ vim &
    [1] 8263
    $ ipython &
    [2] 8264
    $ ps S
     PID TTY      STAT   TIME COMMAND
     3082 pts/0    Ss     0:00 bash
     3137 pts/0    Sl+    0:00 python /usr/bin/ipython
     8207 pts/2    Ss     0:00 bash
     8263 pts/2    T      0:00 vim
     8264 pts/2    Tl     0:00 python /usr/bin/ipython
     8284 pts/2    Tl     0:00 python /usr/bin/ipython
     8355 pts/2    R+     0:00 ps S
    

    如果您想获取 PID,请使用以下方法:

    $ ps S | awk '{print  $  1 }' | grep -E '[0-9]'
    3082
    3137
    8207
    8263
    8264
    8284
    8357
    8358
    835
    

    你也可以使用jobs -l 但它只显示当前会话的后台进程。

    【讨论】:

    • ps S 在我的 shell 中给出了一个巨大的列表(还有来自兄弟 shell 的孩子等)。但是ps --ppid $$ 对我来说很好
    • 我采纳了这个想法,非常感谢 (+1) 并对其进行了修改以更接近我的目标:list=`ps S | grep "search-string" | awk '{print $ 1}'`。现在我可以使用存储在 $list 中的结果来循环执行这些任务:)
    • @code_fodder 我也想过你想要什么grep "search-string" 但你只写了PID。
    • @MichaelKazarian 是的,我知道 :),我只在 awk 之前使用 grep 作为过滤器,让我从“长”描述中找到我想要的 PID。它与您所做的基本相同,但是如果您先执行“awk”,那么我们只有原始 PID 来进行字符串搜索。不过,这只是细微的差别,谢谢!
    • 您的命令行过长。 awk 做所有grep 做的事情,所以ps S | awk '/[0-9]/{print $1}' 做同样的事情。
    【解决方案2】:

    但是对于进程 ID 似乎不起作用?

    您可以尝试jobs -l-p-l-p 开关导致 jobs 命令也输出进程 ID。

    【讨论】:

    • 这个 definatley 有效...谢谢 :),但我希望能够像使用 %1, %2 命令一样单独访问它们。有没有这样的方法?
    • @code_fodder 您可能希望通过while read 循环管道jobs 的输出并获取每一行。
    • jobs -l 如果在另一个控制台/终端/shell 中发出则不起作用,因为作业命令仅显示在当前 shell 会话中运行的作业。
    【解决方案3】:

    在 bash 中,与在 tcsh 中一样,您可能需要的命令是 jobs -l(表示 Long)。

    [ghoti@pc ~]$ sleep 300 &
    [1] 33811
    [ghoti@pc ~]$ sleep 301 &
    [2] 33812
    [ghoti@pc ~]$ sleep 302 &
    [3] 33813
    [ghoti@pc ~]$ jobs -l
    [1]- 33811 Running                 sleep 300 &
    [2]- 33812 Running                 sleep 301 &
    [3]+ 33813 Running                 sleep 302 &
    [ghoti@pc ~]$ 
    

    【讨论】:

    • 这个 definatley 有效...谢谢 :),但我希望能够像使用 %1, %2 命令一样单独访问它们。有没有这样的方法? (与 cnicutar 相同的评论)
    【解决方案4】:

    如果您还想查看 shell 不再将其作为作业处理的子进程(例如,因为您 disowned 他们故意或类似的),那么您可以使用它来查找所有具有 你作为他们的父母:

    grep "PPid:.*$$" /proc/[0-9]*/status | cut -d/ -f3
    

    还有

    ps --ppid $$
    

    可以用。 (感谢@Michael Kazarian,这里也有答案。)

    【讨论】:

    • 感谢这也有效,但我更喜欢 Michaels 帖子中稍微简单的语法。 +1 以获得好的答案/cmets 虽然
    • 我的操作系统默认不挂载/proc,但如果我挂载它,/proc/[0-9]*/status 不包含任何包含Ppid: 的行。如果我想要我的 shell 的父 pid,我使用:ps Oppid $$ 将其添加到 ps 的输出中,或者使用 ps oppid $$ 仅显示 ppid。
    • 是的。除了 Posix(它似乎没有涵盖这个问题)之外,并没有真正可以坚持的标准,因此在 shell 中编写兼容的东西是很困难的。最好使用 Python、C 或类似的语言。
    猜你喜欢
    • 1970-01-01
    • 2019-06-16
    • 1970-01-01
    • 2011-01-26
    • 2012-04-29
    • 2018-02-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多