假设我有任何进程(例如,vi
)的一千个或更多实例正在运行。我如何在一次射击/一行命令/一个命令中将它们全部杀死?
当从命令提示符启动脚本时,shell 将为该脚本生成一个子进程。我想ps
在树形输出中展示终端级进程与其子进程之间的关系。
我怎样才能做到这一点?
到目前为止我尝试过的
文件: script.sh
#!/bin/bash
ps -f -p$1
Run Code Online (Sandbox Code Playgroud)
然后我从命令行调用脚本并传入终端 shell 的进程 ID:
$ ./script.sh $$
Run Code Online (Sandbox Code Playgroud)
我想要的是这样的
ps
命令本身的过程#!/bin/bash
ps -f -p$1
Run Code Online (Sandbox Code Playgroud)
我得到的是:
PID TTY STAT TIME COMMAND
14492 pts/24 Ss 0:00 -bash
Run Code Online (Sandbox Code Playgroud) 此问题是以下问题的后续:如何暂停和恢复进程
我已经从 gnome-terminal 中的 bash 会话启动了 firefox。
进程树如下所示:
$ ps -e -o pid,ppid,cmd -H
1828 1 gnome-terminal
26677 1828 bash
27980 26677 /bin/sh /usr/lib/firefox-3.6.15/firefox
27985 27980 /bin/sh /usr/lib/firefox-3.6.15/run-mozilla.sh /usr/lib/firefox-3.6.15/firefox-bin
27989 27985 /usr/lib/firefox-3.6.15/firefox-bin
28012 27989 /usr/lib/firefox-3.6.15/plugin-container /usr/lib/adobe-flashplugin/libflashplayer.so 27989 plugin true
Run Code Online (Sandbox Code Playgroud)
当我CTRL+Z
使用 bash 时,它会暂停 Firefox。当我发出命令bg
(或fg
)时,它将恢复 Firefox。这正如预期的那样。
当我kill -s SIGTSTP 27980
在另一个终端中发出命令时,它会[1]+ Stopped firefox
在第一个终端中打印该行(就像我点击时一样CTRL+Z
),但它不会挂起 firefox。我假设它只挂起 shell 脚本。
当我kill -s SIGTSTP 27989
在另一个终端中发出命令(注意 PID)时,它会挂起 Firefox。第一终端没有注意到这一点。
bash 如何挂起整个进程树?它是否只是遍历树和 SIGTSTP 所有的孩子?
我想获得父进程为 $pid 的所有进程的列表。这是我想出的最简单的方法:
pstree -p $pid | tr "\n" " " |sed "s/[^0-9]/ /g" |sed "s/\s\s*/ /g"
是否有任何命令或任何更简单的方法来获取子进程列表?
谢谢!