如何安全地杀死Linux进程?

时间:2013-01-28 15:47:34

标签: linux signals sigterm

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

3 个答案:

答案 0 :(得分:2)

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

如果您无法修改代码,并且您已经发现SIGTERM信号残忍地停止了该过程(就像SIGKILL),我想您无法做任何事情来很好地阻止它

答案 1 :(得分:1)

Modulo错误,没有分区(和文件系统)损坏,因为杀死了执行常规文件I / O的进程(即不能将分区用作设备,操作原始块)。

如果该过程不关心处理或忽略信号,SIGTERM将以与SIGKILL相同的无情方式杀死它。对于实际尝试优先退出信号的进程,SIGTERM表示请关闭,而SIGKILL只是杀死(无法捕获它)。

答案 2 :(得分:1)

好吧,您可以修改您的应用程序以捕获除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的情况下,信号处理程序之后的代码将不会执行。