![使用killall 优雅地终止进程](https://linux22.com/image/60236/%E4%BD%BF%E7%94%A8killall%20%E4%BC%98%E9%9B%85%E5%9C%B0%E7%BB%88%E6%AD%A2%E8%BF%9B%E7%A8%8B.png)
我正在使用 Icedove (Thunderbird) 的多个实例(配置文件),当我需要关闭所有实例时,我使用:
killall icedove
根据man killall
,如果未指定信号名称,SIGTERM
则发送。
And, `SIGTERM` allows the process to perform nice termination releasing
resources and saving state if appropriate.
当我在安装插件后关闭 Icedove 时,我对插件所做的配置更改丢失了。我必须重复这些步骤并正确关闭 Icedove(使用菜单中的退出)。
我知道这只是轶事证据。我没有足够的观察来做出任何结论性的主张。
但仍然,有没有可能使终止请求比killall <processname>
,这样终止就像使用菜单->退出关闭应用程序一样干净?
答案1
信号术语允许一个在终止之前执行清理的进程,但该进程是否确实这样做,以及它执行何种类型的清理,取决于程序的编写方式以及(在某种程度上)编写程序的语言的设施在规定。因此,当程序收到 SIGTERM 时,它没有义务保存任何内容,但很可能它当前打开的任何文件都将被关闭。
有比 SIGTERM “更好”的信号,例如 SIGUSR1,但程序会忽略此类信号,除非专门编写程序来侦听它们。
答案2
您可以用来wmctrl
优雅地关闭特定应用程序1的所有窗口(据我所知它是“就像使用菜单->退出关闭应用程序一样干净”)。
使用应用程序wm_class
:
for win in $(wmctrl -lx | awk '$3 ~ /Icedove/ {print $1}'); do wmctrl -ic "$win"; done
使用应用程序pid
:
for win in $(wmctrl -lp | awk -v icepid=$(pgrep icedove) '$3 == icepid {print $1}'); do wmctrl -ic "$win"; done
1:对于支持托盘的应用程序,关闭它会将其最小化到托盘。如果它已经在托盘中,则-c
不会执行任何操作。wmctrl
对于这种情况,没有备用关闭或“终止”命令(来源)。