问题
您是否知道任何工具/脚本可以通过单击进程生成的图形窗口来发送SIGSTOP
(暂停进程)或(恢复进程)?SIGCONT
一些背景信息
已经有一个名为的工具xkill
可以通过单击窗口来终止程序,但它没有发送特定信号的选项。这很遗憾,因为类似的命令行工具kill
有此选项。
通常我通过命令行手动获取相应的进程名称并使用诸如或之类的工具来执行此操作kill
,但如果能够以图形方式执行此操作就更好了,类似于使用该工具单击窗口。pkill
killall
xkill
应用
我发现这样的工具非常有用,当 CPU 过于“紧张”时,它可以以图形方式暂停一些繁重的进程,而无需终止它们,也不会丢失无法保存的数据(例如,长时间计算的部分结果)。
答案1
您可以使用它xdotool
来让用户单击窗口并获取其进程 ID。然后您可以使用它kill
来向该进程发送 STOP 或 CONT 信号,并以此方式冻结/解冻它。
首先,您可能必须安装xdotool
,因为它不是预先安装的:
sudo apt install xdotool
然后,获取特定窗口所属进程的 PID 的命令(可以通过鼠标单击进行选择)将是:
xdotool selectwindow getwindowpid
这将打印数字进程 ID。您可以将其用作参数kill -STOP
或kill -CONT
暂停并继续该进程。这可以通过将 PID 存储在变量中来简化,就像下面的这个小脚本一样,它将被点击窗口的进程暂停 5 秒:
#!/bin/bash
wpid="$(xdotool selectwindow getwindowpid)"
kill -STOP "$wpid"
sleep 5
kill -CONT "$wpid"
您现在可以将该脚本保存在您的计算机上并将其绑定到键盘快捷键。
笔记:
man xdotool
关于getwindowpid
子命令:“这需要拥有窗口的应用程序付出努力,并且可能不适用于所有窗口。”
换句话说,对于某些应用程序,它可能根本不起作用,或者至少不能完全按照预期工作。
也可能出现多个窗口具有相同的对应进程 ID,例如,所有 gnome-terminal 实例都归同一父级所有。在这种情况下,该命令将冻结所有窗口,这可能不是预期的。
答案2
改进 Byte Commander♦ 的答案:
有一个基于 xdtool 的脚本:https://github.com/RegisterFault/clickstop
使用 xdotool 向被点击的应用程序的进程树发送 SIGSTOP 和 SIGCONT 信号的 Bash 脚本
其优点是它将暂停整个进程树,例如暂停多进程 chrome 或 firefox 时就需要这样做。