【问题标题】:Kill a 10 minute old zombie process in linux bash script在 linux bash 脚本中杀死一个 10 分钟前的僵尸进程
【发布时间】:2010-05-04 01:21:49
【问题描述】:

我一直在修改yukondude 的正则表达式答案,但收效甚微。我试图杀死超过 10 分钟的进程。我已经知道进程 ID 是什么。我每 10 分钟循环一次数组,看看是否有任何挥之不去的 procs 存在并且需要被杀死。有人对此有任何快速的想法吗?

ps -eo uid,pid,etime 3233332 | egrep ' ([0-9]+-)?([0-9]{2}:?){3}' | awk '{print $2}' | xargs -I{} kill {}

【问题讨论】:

  • 回声...回声... ... ...

标签: linux bash process kill zombie-process


【解决方案1】:

就像真正的僵尸一样,僵尸进程不能被杀死——它们已经死了。

当他们的父进程调用wait() 以获取他们的退出代码,或者当他们的父进程退出时,他们将离开。


哦,您根本不是在谈论僵尸进程。这个 bash 脚本应该与您所追求的一致:

ps -eo uid,pid,lstart |
    tail -n+2 |
    while read PROC_UID PROC_PID PROC_LSTART; do
        SECONDS=$[$(date +%s) - $(date -d"$PROC_LSTART" +%s)]
        if [ $PROC_UID -eq 1000 -a $SECONDS -gt 600 ]; then
            echo $PROC_PID
        fi
     done |
     xargs kill

这将杀死 UID 1000 拥有的所有运行时间超过 10 分钟(600 秒)的进程。您可能只想将其过滤到您感兴趣的 PID - 可能是通过父进程 ID 或类似的?无论如何,这应该是继续下去的事情。

【讨论】:

  • 对不起,我用“僵尸”作为我在谷歌搜索时发现的。它实际上是启动有时无法正确退出的 PHP 脚本的守护程序的一部分。
  • 嗯,这行得通……主要是。我在 OSX 上...除了使用“date -d”之外,还有什么方法可以进行日期比较? Mac 不允许使用 -d。
  • 嗯,问题是ps 并没有真正以特别好的格式给出经过时间或进程开始时间。当然可以解析它,但这很痛苦 - 最简单的方法可能是为您的 OS X 机器构建 GNU date 并在脚本中显式使用它而不是系统的 date
  • 当父进程调用 wait() 或父进程退出时,发送给子进程的信号是什么。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-06-01
  • 1970-01-01
  • 2011-09-14
  • 2014-06-19
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多