【问题标题】:How to safely kill Linux process?如何安全地杀死 Linux 进程?
【发布时间】:2013-01-12 00:13:20
【问题描述】:

不断向 FAT32 分区写入文件 (~1/s) 的嵌入式 Linux 系统在中断时偶尔会损坏分区。该过程可以通过 2 种方式中断:重启,或使用 musb_hdrc/gadget 通过 USB 将文件复制到主机或从主机复制文件。 musb_hdrc/gadget 用于将分区的访问从内部嵌入式控制切换到 USB,以便与外部主机传输文件。解决方案可能是执行killall process-name,但这会安全地杀死 Linux 进程吗? IOW:该过程会完成任何已经启动的文件 IO,还是仍然存在损坏的分区?根据killall man pageIf no signal name is specified SIGTERM is sent. 是否需要在代码中添加一些内容以确保 kill 是干净的和/或是否有特殊的 killall 信号名称来进行干净的 kill?

【问题讨论】:

    标签: linux signals sigterm


    【解决方案1】:

    如果代码写得很好,该进程应该捕获SIGTERM 并干净地停止它正在做的事情并干净地关闭每个打开的资源。

    如果您无法修改代码,并且您已经观察到 SIGTERM 信号会残酷地停止该过程(就像 SIGKILL 一样),我想您无法很好地停止它。

    【讨论】:

      【解决方案2】:

      好吧,您可以修改您的应用程序以捕获除 SIGKILL 之外的任何信号。
      可以在信号处理程序中执行关闭操作或清理
      这是一个设置处理程序以在某些致命信号发生时删除临时文件的简单示例:

      #include <signal.h>
      
       void
       termination_handler (int signum)
       {
         printf ("Caught signal %d\n", sig);
         switch(signum)
         {
             case SIGINT:
             printf ("CTRL C not allowed\n");
             break;
      
             case SIGTERM:
             struct temp_file *p;
             for (p = temp_file_list; p; p = p->next)
                 unlink (p->name);
             exit(1);
             break;
      
             default:
         ...
         }
       }
      
       int
       main (void)
       {
         ...
         if (signal (SIGINT, termination_handler) == SIG_IGN)
           signal (SIGINT, SIG_IGN);
         if (signal (SIGHUP, termination_handler) == SIG_IGN)
           signal (SIGHUP, SIG_IGN);
         if (signal (SIGTERM, termination_handler) == SIG_IGN)
           signal (SIGTERM, SIG_IGN);
         ...
       }
      

      信号处理程序之后的代码在 SIGTERM 的情况下不会执行。

      【讨论】:

      • 在我的代码中添加了与您的示例类似的内容。谢谢一百万。
      【解决方案3】:

      Modulo 错误,不会因为终止执行常规文件 I/O 的进程而导致分区(和文件系统)损坏(即不能将分区用作设备,操作原始块)。

      如果进程不想处理或忽略信号,SIGTERM 会以与SIGKILL 相同的无情方式杀死它。对于实际上尝试在信号上正常退出的进程,SIGTERM 表示请您关闭,而SIGKILL 只是杀死(不可能捕获它)。

      【讨论】:

        猜你喜欢
        • 2023-03-08
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-10-17
        • 2015-06-08
        • 1970-01-01
        • 1970-01-01
        • 2015-01-11
        相关资源
        最近更新 更多