使用killall 优雅地终止进程

使用killall 优雅地终止进程

我正在使用 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对于这种情况,没有备用关闭或“终止”命令(来源)。

相关内容