kill -9不起作用

我有一个服务器上有3个oracle实例,文件系统是netapp的nfs。 closures数据库后,每个数据库的一个进程不会长时间退出。 每个杀-i都不行。 我试图桁架,pfile它,通过错误的命令。

而且iostat显示netapp服务器有很多IO。 所以有人说这个过程是忙于写数据到远程netapp服务器,并且在写入完成之前,它不会退出。 所以需要做的只是等到所有的IO都完成了。

等待较长时间(大约1.5小时)后,stream程退出。

所以我的问题是:一个进程如何忽略kill信号? 据我所知,如果我们杀了-9,它会立即停止。 你有没有遇到这种情况 – 我不会立即杀死这个进程?

 TEST7-stdby-phxdbnfs11 $> ps -ef | grep dbw0
   oracle 1469 25053 0 22:36:53 pts / 1 0:00 grep dbw0
   oracle 26795 1 0 21:55:23?  0:00 ora_dbw0_TEST7
   oracle 1051 1 0 08年4月?  3958:51 ora_dbw0_TEST2
   oracle 471 1 0 Apr 08?  6391:43 ora_dbw0_TEST1
 TEST7-stdby-phxdbnfs11 $> kill -9 1051 
 TEST7-stdby-phxdbnfs11 $> ps -ef | grep dbw0
   oracle 1493 25053 0 22:37:07 pts / 1 0:00 grep dbw0
   oracle 26795 1 0 21:55:23?  0:00 ora_dbw0_TEST7
   oracle 1051 1 0 08年4月?  3958:51 ora_dbw0_TEST2
   oracle 471 1 0 Apr 08?  6391:43 ora_dbw0_TEST1
 TEST7-stdby-phxdbnfs11 $> kill -9 471
 TEST7-stdby-phxdbnfs11 $> ps -ef | grep dbw0
   oracle 26795 1 0 21:55:23?  0:00 ora_dbw0_TEST7
   oracle 1051 1 0 08年4月?  3958:51 ora_dbw0_TEST2
   oracle 471 1 0 Apr 08?  6391:43 ora_dbw0_TEST1
   oracle 1495 25053 0 22:37:22 pts / 1 0:00 grep dbw0
 TEST7-stdby-phxdbnfs11 $> ps -ef | grep smon
   oracle 1524 25053 0 22:38:02 pts / 1 0:00 grep smon
 TEST7-stdby-phxdbnfs11 $> ps -ef | grep dbw0
   oracle 1526 25053 0 22:38:06 pts / 1 0:00 grep dbw0
   oracle 26795 1 0 21:55:23?  0:00 ora_dbw0_TEST7
   oracle 1051 1 0 08年4月?  3958:51 ora_dbw0_TEST2
   oracle 471 1 0 Apr 08?  6391:43 ora_dbw0_TEST1
 TEST7-stdby-phxdbnfs11 $> kill -9 1051 471 26795
 TEST7-stdby-phxdbnfs11 $> ps -ef | grep dbw0
   oracle 1528 25053 0 22:38:19 pts / 1 0:00 grep dbw0
   oracle 26795 1 0 21:55:23?  0:00 ora_dbw0_TEST7
   oracle 1051 1 0 08年4月?  3958:51 ora_dbw0_TEST2
   oracle 471 1 0 Apr 08?  6391:43 ora_dbw0_TEST1

 TEST7-stdby-phxdbnfs11 $> truss -p 26795
桁架:意料之外的系统错误:26795

 TEST7-stdby-phxdbnfs11 $> pfiles 26795
 pfiles:意外的系统错误:26795

只有处于“用户空间”时,进程才会得到KILL信号(所有信号的行为都是相同的)。 如果它在内核空间(例如等待一个NFS共享传送从文件读取的数据),它不会得到信号(信号将等待,直到过程返回到用户空间,它不会丢失)。

大多数NFSD都有一些关于这个的选项,如果超时,它可以从失败状态读取返回。 这将导致数据丢失(如同其他选项一样),因为不是所有的程序都检查所有的read()结果。

进程不能忽略/取消KILL信号,它只是通知,并提供保存所有必要数据的机会。

这个问题没有指定客户端平台,所以我假设Linux。


请参阅Linux NFS站点上的相关FAQ 。

进程不能忽略SIGKILL,但系统调用可以阻止信号被处理。

有两个用于Linux客户端的安装标志可以用来解决这个问题: softintr

soft导致NFS在请求失败时最终放弃。 如果你的应用程序在面对系统调用失败(以及很多很多应用程序没有这么写)时不能很好地编写,那么它可能会导致数据损坏。

intr尝试使NFS系统调用以比soft更安全的方式中断。 但是,仍然有可能将一个内置的intr,hard挂载到一个不可驱动的状态。