使用`killall -9服务器; ./server&`重启unix服务 - 持久性问题?

时间:2012-02-22 15:39:08

标签: signals daemon

在我的公司,我看到使用killall -9来杀死守护进程,然后再次启动它们。 (这应该是killall -SIGKILL

我试图向同事解释这不应该是我们重启守护进程的方式。也许使用SIGINT符号以便进程可以正确关闭或使用init.d脚本正确地重新启动服务。

我们在C进行编程,那么是否有任何可能会因为SIGKILL而对系统造成损害的事情?显然这个信号不能被进程捕获,所以没有内部信号处理程序可以做任何好的关机处理,但是

  • 文件读/写缓冲区是否会正确刷新?
  • 是否可以正确回收动态内存?
  • 还有其他例子吗?

我能猜出这些问题的答案,但是有没有人知道的答案?任何人都可以利用他们的Unix知识来帮助我吗?凭借具体的知识,我可以提出更好的论点!

1 个答案:

答案 0 :(得分:2)

一个。读/写缓冲区。这是一个简单的实验,希望能够向同事“证明”异常终止是不好的。执行这个perl脚本,当它处于休眠状态时,kill -9它:

#!/usr/bin/perl
open FILE, ">file.txt" or die $!;
print FILE "This is it";
sleep 100;
close FILE;

在我的机器上,如果我在'close'=>之前杀了,file.txt为空看起来像异常终止可能意味着数据丢失。更多关于这个问题的接受答案: What happens if I don't call fclose() in a C program?

动态分配的内存已释放。这基本上是程序内存空间中的一块内存,称为“堆”。程序请求OS根据动态分配调整堆大小,并且OS知道该块的限制。即使在程序的干净exit上,如果它有内存泄漏,也会回收此内存。