SIGSTOP
我可以通过发送和信号来暂停和恢复进程SIGCONT
。
以火狐浏览器为例:
pkill --signal SIGSTOP firefox
pkill --signal SIGCONT firefox
事实是,Firefox 还有一些辅助进程,如Web Content
、WebExtensions
、 且RDD Process
持续运行。
有没有办法暂停和取消暂停属于应用程序的整个进程组?
答案1
对于这类事情的通常答案是您应该向进程发送信号团体而不仅仅是过程。产生的所有进程都firefox
应该位于同一个进程组中。事实上,在我的系统上:
$ ps -aeo pgid,ppid,pid,s,comm,args | grep -E '[f]irefox|[P]PID'
PGID PPID PID S COMMAND COMMAND
1095 1 151407 S firefox /usr/lib/firefox/firefox
1095 151407 151541 S Web Content /usr/lib/firefox/firefox -contentproc -childID 1 -isForBrowser -prefsLen 1 -prefMapSize 225550 -parentBuildID 20200603085854 -appdir /usr/lib/firefox/browser 151407 true tab
1095 151407 151607 S WebExtensions /usr/lib/firefox/firefox -contentproc -childID 2 -isForBrowser -prefsLen 136 -prefMapSize 225550 -parentBuildID 20200603085854 -appdir /usr/lib/firefox/browser 151407 true tab
1095 151407 151689 S Web Content /usr/lib/firefox/firefox -contentproc -childID 3 -isForBrowser -prefsLen 136 -prefMapSize 225550 -parentBuildID 20200603085854 -appdir /usr/lib/firefox/browser 151407 true tab
1095 151407 151711 S Web Content /usr/lib/firefox/firefox -contentproc -childID 4 -isForBrowser -prefsLen 136 -prefMapSize 225550 -parentBuildID 20200603085854 -appdir /usr/lib/firefox/browser 151407 true tab
1095 151407 151738 S Web Content /usr/lib/firefox/firefox -contentproc -childID 5 -isForBrowser -prefsLen 136 -prefMapSize 225550 -parentBuildID 20200603085854 -appdir /usr/lib/firefox/browser 151407 true tab
1095 151407 151765 S Web Content /usr/lib/firefox/firefox -contentproc -childID 6 -isForBrowser -prefsLen 136 -prefMapSize 225550 -parentBuildID 20200603085854 -appdir /usr/lib/firefox/browser 151407 true tab
1095 151407 151802 S Web Content /usr/lib/firefox/firefox -contentproc -childID 7 -isForBrowser -prefsLen 136 -prefMapSize 225550 -parentBuildID 20200603085854 -appdir /usr/lib/firefox/browser 151407 true tab
1095 151407 151876 S Web Content /usr/lib/firefox/firefox -contentproc -childID 8 -isForBrowser -prefsLen 136 -prefMapSize 225550 -parentBuildID 20200603085854 -appdir /usr/lib/firefox/browser 151407 true tab
1095 151407 151889 S Web Content /usr/lib/firefox/firefox -contentproc -childID 9 -isForBrowser -prefsLen 136 -prefMapSize 225550 -parentBuildID 20200603085854 -appdir /usr/lib/firefox/browser 151407 true tab
1095 151407 151928 S Privileged Cont /usr/lib/firefox/firefox -contentproc -childID 10 -isForBrowser -prefsLen 136 -prefMapSize 225550 -parentBuildID 20200603085854 -appdir /usr/lib/firefox/browser 151407 true tab
所以通常情况下,我可以直接运行kill -19 -1095
,这会挂起进程组的所有成员1095
。不幸的是,至少在我的系统上,这个组不仅仅包含 Firefox:
$ ps -aeo pgid,ppid,pid,s,comm,args | awk '$1==1095' | wc
104 1382 29087
该组中有 104 个进程,包括 Xorg 或我的显示管理器登录等基本工具。因此,虽然这在技术上可行,因为它会暂停 Firefox,但它也会暂停我的整个 GUI,导致系统无响应。
因此,您可以使用以下-f
标志pkill
:
-f,--完整
该模式通常仅与进程名称匹配。设置 -f 时,将使用完整命令行。
如果我现在运行pkill -f -19 firefox
,则命令行匹配的所有进程firefox
都将被挂起(查看该S
列):
$ pkill -f -19 firefox
$ ps -aeo ppid,pid,s,comm,args | grep -E '[f]irefox|[P]PID'
PGID PPID PID S COMMAND COMMAND
1095 1 151407 T firefox /usr/lib/firefox/firefox
1095 151407 151541 T Web Content /usr/lib/firefox/firefox -contentproc -childID 1 -isForBrowser -prefsLen 1 -prefMapSize 225550 -parentBuildID 20200603085854 -appdir /usr/lib/firefox/browser 151407 true tab
1095 151407 151607 T WebExtensions /usr/lib/firefox/firefox -contentproc -childID 2 -isForBrowser -prefsLen 136 -prefMapSize 225550 -parentBuildID 20200603085854 -appdir /usr/lib/firefox/browser 151407 true tab
1095 151407 151689 T Web Content /usr/lib/firefox/firefox -contentproc -childID 3 -isForBrowser -prefsLen 136 -prefMapSize 225550 -parentBuildID 20200603085854 -appdir /usr/lib/firefox/browser 151407 true tab
1095 151407 151711 T Web Content /usr/lib/firefox/firefox -contentproc -childID 4 -isForBrowser -prefsLen 136 -prefMapSize 225550 -parentBuildID 20200603085854 -appdir /usr/lib/firefox/browser 151407 true tab
1095 151407 151738 T Web Content /usr/lib/firefox/firefox -contentproc -childID 5 -isForBrowser -prefsLen 136 -prefMapSize 225550 -parentBuildID 20200603085854 -appdir /usr/lib/firefox/browser 151407 true tab
1095 151407 151765 T Web Content /usr/lib/firefox/firefox -contentproc -childID 6 -isForBrowser -prefsLen 136 -prefMapSize 225550 -parentBuildID 20200603085854 -appdir /usr/lib/firefox/browser 151407 true tab
1095 151407 151802 T Web Content /usr/lib/firefox/firefox -contentproc -childID 7 -isForBrowser -prefsLen 136 -prefMapSize 225550 -parentBuildID 20200603085854 -appdir /usr/lib/firefox/browser 151407 true tab
1095 151407 151876 T Web Content /usr/lib/firefox/firefox -contentproc -childID 8 -isForBrowser -prefsLen 136 -prefMapSize 225550 -parentBuildID 20200603085854 -appdir /usr/lib/firefox/browser 151407 true tab
1095 151407 151889 T Web Content /usr/lib/firefox/firefox -contentproc -childID 9 -isForBrowser -prefsLen 136 -prefMapSize 225550 -parentBuildID 20200603085854 -appdir /usr/lib/firefox/browser 151407 true tab
1095 151407 151928 T Privileged Cont /usr/lib/firefox/firefox -contentproc -childID 10 -isForBrowser -prefsLen 136 -prefMapSize 225550 -parentBuildID 20200603085854 -appdir /usr/lib/firefox/browser 151407 true tab
当然,这意味着如果您有一个firefoxManual
在文本编辑器中名为 open 的文本文件,或者任何其他匹配的进程firefox
,那么它也将被挂起。
或者,如果您想 100% 确定只获得正确的进程,您可以获取 Firefox 的 PID,然后向其以及将其作为父 ID 的所有进程发送信号:
pkill -19 firefox; pgrep -P $(pgrep firefox) | xargs kill -19
你甚至可以把它变成一个函数:
myKill(){
pkill "$1" "$2"; pgrep -P $(pgrep "$2") | xargs kill "$1"
}
现在您可以通过以下方式阻止它们:
myKill -19 firefox
并重新启动:
myKill -18 firefox
答案2
pkill
这是一个很棒的工具,根据 man 的说法,它可以“根据名称查找或发出信号处理”。而且,它匹配多个进程。只要所有 Web 内容和 Web 扩展都以相同的文件名运行,我们就可以使用pkill -19 firefox-esr
尽可能多的暂停所有子进程。
在某些时候它可能不安全,如果我们想要匹配 Firefox 的特定安装(但所有实例),我们可以使用以下命令查询 PID fuser
(显示哪些进程正在使用指定的计算机文件):fuser /usr/lib/firefox-esr/firefox-esr | grep -Es "[0-9]+" | xargs kill -19
(-18 恢复)。
最后的结果可以使用 concatenating 检查| xargs ps
,它将输出进程状态为“Sl”(可中断睡眠,多线程)。
答案3
假设您的 Linux 已经升级到 cgroups v2 并且您的ID=1000
:
systemd-run --user --slice=firefox.slice firefox
# To freeze
echo 1 > /sys/fs/cgroup/user.slice/user-1000.slice/[email protected]/firefox.slice/cgroup.freeze
# To unfreeze
echo 0 > /sys/fs/cgroup/user.slice/user-1000.slice/[email protected]/firefox.slice/cgroup.freeze