kill -9 不起作用

kill -9 不起作用

我有一台服务器上有 3 个 oracle 实例,文件系统是使用 netapp 的 nfs。关闭数据库后,每个数据库的一个进程很长时间都没有退出。每次 kill -i 都不起作用。我尝试 truss,pfile 它,命令失败。

iostat 显示有大量 IO 发送到 netapp 服务器。有人说该进程正忙于将数据写入远程 netapp 服务器,在写入完成之前它不会退出。所以需要做的就是等待所有 IO 完成。

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

所以我的问题是:进程如何忽略终止信号?据我所知,如果我们 kill -9,它会立即停止。您是否遇到过 kill -i 不会立即终止进程的情况?

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 4月 08日 ? 3958:51 ora_dbw0_TEST2
  oracle 471 1 0 4月 08日? 6391:43 ora_dbw0_TEST1
TEST7-stdby-phxdbnfs11$> 杀死-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 4月 08日 ? 3958:51 ora_dbw0_TEST2
  oracle 471 1 0 4月 08日? 6391:43 ora_dbw0_TEST1
TEST7-stdby-phxdbnfs11$> 杀死 -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 4月 08日 ? 3958:51 ora_dbw0_TEST2
  oracle 471 1 0 4月 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 4月 08日 ? 3958:51 ora_dbw0_TEST2
  oracle 471 1 0 4月 08日? 6391:43 ora_dbw0_TEST1
TEST7-stdby-phxdbnfs11$> 杀死-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 4月 08日 ? 3958:51 ora_dbw0_TEST2
  oracle 471 1 0 4月 08日? 6391:43 ora_dbw0_TEST1

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

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

答案1

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

大多数 NFSD 都对此有一些选项,如果超时,它可以从读取返回失败状态。这将导致数据丢失(其他选项也是如此......)因为并非所有程序都会检查所有read()结果。

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

答案2

问题没有指定客户端平台,因此我假设是 Linux。


Linux NFS 网站上的相关常见问题解答

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

Linux 客户端有两个挂载标志可用于解决此问题:softintr

soft导致 NFS 在请求失败时最终放弃。如果您的应用程序在系统调用失败时没有很好地编写,则可能会导致数据损坏。

intr尝试以比 更安全的方式使 NFS 系统调用可中断soft。但是,仍有可能使intr,hard挂载进入不可终止状态。

相关内容