【发布时间】:2014-12-16 12:37:02
【问题描述】:
我正在尝试测试一种在受控环境中难以重现的行为。
用例: Linux系统;通常是 Redhat EL 5 或 6(我们刚开始使用 RHEL 7 和 systemd,所以目前不在范围内)。
在某些情况下,我需要重新启动服务。我们用于停止服务的脚本通常运行良好;它向进程发送一个 SIGTERM,该进程旨在处理它;如果进程在超时(通常是几分钟)内没有处理 SIGTERM,则脚本会发送一个 SIGKILL,然后再等待几分钟。
问题是:在某些(罕见的)情况下,进程在 SIGKILL 之后不会退出;这通常发生在它严重卡在系统调用上时,可能是由于内核级别的问题(损坏的文件系统,或不工作的 NFS 文件系统,或同样糟糕的需要手动干预的事情)。
当脚本没有意识到“旧”进程实际上并没有退出并在旧进程仍在运行时启动新进程时,就会出现错误;我们正在使用更强大的锁定系统来解决这个问题(这样至少如果旧进程正在运行,新进程不会启动),但是我发现很难测试整个事情,因为我没有' t 找到了模拟困难过程的方法。
所以,问题是:
如何手动模拟在向其发送 SIGKILL 时不退出的进程,即使作为特权用户也是如此?
【问题讨论】:
-
您是否检查过系统日志并查找处于不可中断或阻塞状态的进程是否可能卡在执行 I/O。
-
@askb 我不是在问“为什么进程卡住了”。我可以处理,通常会有内核无法处理的硬故障。我想让我的服务脚本更好,所以我问“如何在不间断的系统调用中阻止进程”以执行我的测试。
标签: linux process linux-kernel