nutty about natty Asked: 2015-09-22 05:23:04 +0800 CST2015-09-22 05:23:04 +0800 CST 2015-09-22 05:23:04 +0800 CST killall 的更温和/更温和/更微妙的等效替代品(例如“endall”)? 772 我如何以比以前更温和的方式结束所有具有相同名称的进程killall?我不想打断进程,但要让他们有时间适当退出。 也可以看看: 如何在 Ubuntu 中终止进程? 在系统监视器中,Kill Process 和 End Process 有什么区别? 为什么 killall (有时?)需要应用两次? tl;博士 command-line 3 个回答 Voted Best Answer hvd 2015-09-22T05:49:43+08:002015-09-22T05:49:43+08:00 1. `killall` 已经很好了 (SIGTERM) killall默认发送SIGTERM. 这已经是让应用程序有机会自行清理的好方法。“去死吧,现在!” 方法是发送一个SIGKILL信号,这需要将其指定为killall. 来自GNU C 库:终止信号: 宏:int SIGTERM [...] 这是礼貌地要求程序终止的正常方式。 2. System Monitor 的“结束进程”同样不错(SIGTERM,也是) 您链接到有关 GNOME 系统监视器的问题。这也确实SIGTERM用于其“结束流程”操作(我意识到我与该问题的答案相矛盾)。你可以在源代码中找到它来验证自己: 数据/menus.ui: <item> <attribute name="label" translatable="yes">_End</attribute> <attribute name="action">win.send-signal-end</attribute> <attribute name="accel"><Primary>e</attribute> <attribute name="target" type="i">15</attribute> </item> 这里的15是信号编号。信号 15 是SIGTERM。SIGTERM在提出和回答其他问题之前,系统监视器已经使用得很好。 技术附录(回应评论) 查看 的 Github 表示git blame,这里是对信号在 GNOME 系统监视器源代码中的拼写方式所做的更改: 383007f2 2013 年 7 月 24 日用 GAction 参数发送信号的重复代码 0e766b2d 2013年 7 月 18 日将进程弹出菜单移植到 GAction 97674c79 2012 年 10 月 3 日摆脱 ProcData 结构 38c5296c 2011 年 7 月 3 日使源文件之间的缩进统一。 这些都没有从SIGQUIT变为SIGTERM,最后一个是在提出相关问题之前。 Roger Light 2015-09-22T08:56:20+08:002015-09-22T08:56:20+08:00 @hvd 的回答基本正确。为了进一步支持这一点,该init进程将首先SIGTERM在您关闭计算机时发送给进程,然后在延迟后发送(SIGKILL如果它们尚未退出)。进程无法处理/忽略SIGKILL。 不过,要提供更多细节,真正的答案是您无法确定程序是否处理了它。SIGTERM是最常用的信号,用于礼貌地要求程序退出,但所有信号处理都取决于程序对信号的处理。 换句话说,根据其他答案,如果您有一个由@Jos 或@AlexGreg 编写的程序,那么他们可能会处理SIGQUIT但可能不会SIGTERM,因此发送SIGTERM会比 . 更“软” SIGQUIT。 我已经写了一些代码,所以你可以自己玩。将以下内容另存为signal-test.c,然后编译 gcc -o signal-test signal-test.c 然后您可以运行它./signal-test,看看当您使用 发送不同的信号时会发生什么killall -s <signal>。 #include <stdio.h> #include <signal.h> #include <unistd.h> int flag = 0; void handle_signal(int s) { flag = s; } int main(int argc, char *argv[]) { signal(SIGTERM, handle_signal); signal(SIGQUIT, handle_signal); while(flag == 0){ sleep(1); } printf("flag is %d\n", flag); return flag; } 就目前而言,代码可以优雅地处理 SIGTERM 和 SIGQUIT。您可以尝试注释掉这些行signal(SIG...(//在行的开头使用 a )以删除信号处理程序,然后再次运行并发送信号。您应该能够看到这些不同的输出: $ ./signal-test Terminated $ ./signal-test Quit (core dumped) $ ./signal-test flag is 15 $ ./signal-test flag is 3 取决于您是否处理信号。 您也可以尝试忽略信号: signal(SIGTERM, SIG_IGN); 如果您这样做,那么发送SIGTERM将不会执行任何操作,您必须使用SIGKILL来结束该过程。 中的更多详细信息man 7 signal。请注意,signal()以这种方式使用被认为是不可移植的 - 虽然它比替代方法容易得多! 另一个小脚注 - 在 Solaris 上killall试图终止所有进程。他们全部。如果您以 root 身份运行它,那么您可能会感到惊讶 :) Jos 2015-09-22T05:29:05+08:002015-09-22T05:29:05+08:00 “结束一切”将是killall -s SIGQUIT [process name]。如果您想要一个奇特的解决方案,请定义alias endall='killall -s SIGQUIT'.
1. `killall` 已经很好了 (SIGTERM)
killall
默认发送SIGTERM
. 这已经是让应用程序有机会自行清理的好方法。“去死吧,现在!” 方法是发送一个SIGKILL
信号,这需要将其指定为killall
. 来自GNU C 库:终止信号:2. System Monitor 的“结束进程”同样不错(SIGTERM,也是)
您链接到有关 GNOME 系统监视器的问题。这也确实
SIGTERM
用于其“结束流程”操作(我意识到我与该问题的答案相矛盾)。你可以在源代码中找到它来验证自己:数据/menus.ui:
这里的15是信号编号。信号 15 是
SIGTERM
。SIGTERM
在提出和回答其他问题之前,系统监视器已经使用得很好。技术附录(回应评论)
查看 的 Github 表示
git blame
,这里是对信号在 GNOME 系统监视器源代码中的拼写方式所做的更改:383007f2 2013 年 7 月 24 日用 GAction 参数发送信号的重复代码 0e766b2d
2013年 7 月 18 日将进程弹出菜单移植到 GAction
97674c79 2012 年 10 月 3 日摆脱 ProcData 结构
38c5296c 2011 年 7 月 3 日使源文件之间的缩进统一。
这些都没有从
SIGQUIT
变为SIGTERM
,最后一个是在提出相关问题之前。@hvd 的回答基本正确。为了进一步支持这一点,该
init
进程将首先SIGTERM
在您关闭计算机时发送给进程,然后在延迟后发送(SIGKILL
如果它们尚未退出)。进程无法处理/忽略SIGKILL
。不过,要提供更多细节,真正的答案是您无法确定程序是否处理了它。
SIGTERM
是最常用的信号,用于礼貌地要求程序退出,但所有信号处理都取决于程序对信号的处理。换句话说,根据其他答案,如果您有一个由@Jos 或@AlexGreg 编写的程序,那么他们可能会处理
SIGQUIT
但可能不会SIGTERM
,因此发送SIGTERM
会比 . 更“软”SIGQUIT
。我已经写了一些代码,所以你可以自己玩。将以下内容另存为
signal-test.c
,然后编译然后您可以运行它
./signal-test
,看看当您使用 发送不同的信号时会发生什么killall -s <signal>
。就目前而言,代码可以优雅地处理 SIGTERM 和 SIGQUIT。您可以尝试注释掉这些行
signal(SIG...
(//
在行的开头使用 a )以删除信号处理程序,然后再次运行并发送信号。您应该能够看到这些不同的输出:取决于您是否处理信号。
您也可以尝试忽略信号:
如果您这样做,那么发送
SIGTERM
将不会执行任何操作,您必须使用SIGKILL
来结束该过程。中的更多详细信息
man 7 signal
。请注意,signal()
以这种方式使用被认为是不可移植的 - 虽然它比替代方法容易得多!另一个小脚注 - 在 Solaris 上
killall
试图终止所有进程。他们全部。如果您以 root 身份运行它,那么您可能会感到惊讶 :)“结束一切”将是
killall -s SIGQUIT [process name]
。如果您想要一个奇特的解决方案,请定义alias endall='killall -s SIGQUIT'
.