AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • 主页
  • 系统&网络
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • 主页
  • 系统&网络
    • 最新
    • 热门
    • 标签
  • Ubuntu
    • 最新
    • 热门
    • 标签
  • Unix
    • 最新
    • 标签
  • DBA
    • 最新
    • 标签
  • Computer
    • 最新
    • 标签
  • Coding
    • 最新
    • 标签
主页 / ubuntu / 问题 / 676657
Accepted
nutty about natty
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 3 个回答
  • 2956 Views

3 个回答

  • Voted
  1. 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">&lt;Primary&gt;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,最后一个是在提出相关问题之前。

    • 44
  2. 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 身份运行它,那么您可能会感到惊讶 :)

    • 5
  3. 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

相关问题

  • 如何从命令行仅安装安全更新?关于如何管理更新的一些提示

  • 如何从命令行刻录双层 dvd iso

  • 如何从命令行判断机器是否需要重新启动?

  • 文件权限如何工作?文件权限用户和组

  • 如何在 Vim 中启用全彩支持?

Sidebar

Stats

  • 问题 205573
  • 回答 270741
  • 最佳答案 135370
  • 用户 68524
  • 热门
  • 回答
  • Marko Smith

    如何运行 .sh 脚本?

    • 16 个回答
  • Marko Smith

    如何安装 .tar.gz(或 .tar.bz2)文件?

    • 14 个回答
  • Marko Smith

    如何列出所有已安装的软件包

    • 24 个回答
  • Marko Smith

    无法锁定管理目录 (/var/lib/dpkg/) 是另一个进程在使用它吗?

    • 25 个回答
  • Martin Hope
    Flimm 如何在没有 sudo 的情况下使用 docker? 2014-06-07 00:17:43 +0800 CST
  • Martin Hope
    Ivan 如何列出所有已安装的软件包 2010-12-17 18:08:49 +0800 CST
  • Martin Hope
    La Ode Adam Saputra 无法锁定管理目录 (/var/lib/dpkg/) 是另一个进程在使用它吗? 2010-11-30 18:12:48 +0800 CST
  • Martin Hope
    David Barry 如何从命令行确定目录(文件夹)的总大小? 2010-08-06 10:20:23 +0800 CST
  • Martin Hope
    jfoucher “以下软件包已被保留:”为什么以及如何解决? 2010-08-01 13:59:22 +0800 CST
  • Martin Hope
    David Ashford 如何删除 PPA? 2010-07-30 01:09:42 +0800 CST

热门标签

10.10 10.04 gnome networking server command-line package-management software-recommendation sound xorg

Explore

  • 主页
  • 问题
    • 最新
    • 热门
  • 标签
  • 帮助

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve