如何杀死早于“t”的进程?

hob*_*ave 16 linux kill process

首先,是的,我见过这个问题:

查找(并杀死)旧进程

那里的答案不正确,不起作用。我已经投票并相应地发表了评论。

当列出时,我想杀死的进程如下所示ps aux | grep page.py

阿帕奇424 0.0 0.1 6996 4564?S 07:02 0:00 /usr/bin/python2.6 /u/apps/pysnpp/current/bin/page.py
阿帕奇2686 0.0 0.1 7000 3460?S Sep10 0:00 /usr/bin/python2.6 /u/apps/pysnpp/current/bin/page.py
阿帕奇2926 0.0 0.0 6996 1404?S Sep02 0:00 /usr/bin/python2.6 /u/apps/pysnpp/current/bin/page.py
阿帕奇7398 0.0 0.0 6996 1400?S Sep01 0:00 /usr/bin/python2.6 /u/apps/pysnpp/current/bin/page.py
阿帕奇9423 0.0 0.1 6996 3824?S Sep10 0:00 /usr/bin/python2.6 /u/apps/pysnpp/current/bin/page.py
阿帕奇11022 0.0 0.0 7004 1400?S Sep01 0:00 /usr/bin/python2.6 /u/apps/pysnpp/current/bin/page.py
阿帕奇15343 0.0 0.1 7004 3788?S Sep09 0:00 /usr/bin/python2.6 /u/apps/pysnpp/current/bin/page.py
阿帕奇15364 0.0 0.1 7004 3792?S Sep09 0:00 /usr/bin/python2.6 /u/apps/pysnpp/current/bin/page.py
阿帕奇15397 0.0 0.1 6996 3788?S Sep09 0:00 /usr/bin/python2.6 /u/apps/pysnpp/current/bin/page.py
阿帕奇16817 0.0 0.1 7000 3788?S Sep09 0:00 /usr/bin/python2.6 /u/apps/pysnpp/current/bin/page.py
阿帕奇17590 0.0 0.0 7000 1432?S Sep07 0:00 /usr/bin/python2.6 /u/apps/pysnpp/current/bin/page.py
阿帕奇24448 0.0 0.0 7000 1432?S Sep07 0:00 /usr/bin/python2.6 /u/apps/pysnpp/current/bin/page.py
阿帕奇 30361 0.0 0.1 6996 3776 ? S Sep09 0:00 /usr/bin/python2.6 /u/apps/pysnpp/current/bin/page.py

我正在寻找设置一个简单的每日 cron 来查找并杀死任何page.py超过一个小时的进程。

上述问题的公认答案不起作用,因为它与时间范围不匹配,它只是匹配从 7 天到 7 天 23 小时 59 分 59 秒运行的进程。我不想杀死运行 1-2 小时的进程,而是杀死超过1 小时的任何进程。

上述问题的另一个答案 usingfind不起作用,至少在 Gentoo 或 CentOS 5.4 上不起作用,它要么发出警告,要么如果遵循所述警告的建议,则不返回任何内容。

Jod*_*e C 24

GNU Killall 可以使用进程名杀死超过给定年龄的进程。

if [[ "$(uname)" = "Linux" ]];then killall --older-than 1h page.py;fi
Run Code Online (Sandbox Code Playgroud)


hob*_*ave 9

感谢克里斯托弗的回答,我能够将其调整为以下内容:

find /proc -maxdepth 1 -user apache -type d -mmin +60 -exec basename {} \; \
| xargs ps | grep page.py | awk '{ print $1 }' | sudo xargs kill
Run Code Online (Sandbox Code Playgroud)

-mmin 是我缺少的 find 命令。

  • 不确定 -mmin 是否适合检测进程的年龄。 (3认同)
  • 不幸的是,不能依赖 /proc 中的时间戳。至少现在不会了。 (3认同)

eug*_*evd 9

find 并不总是有效,并非每个系统都有可用的 etime,这可能是我的 regex newb 状态,但我认为您不需要比这更多的东西:

ps -eo pid,etimes,comm,user,tty | awk '{if ($4 ~ /builder/ && $5 ~ /pts/ && $2>600) print $1}'
Run Code Online (Sandbox Code Playgroud)
  • 列出所有进程并提供列 PID、ELAPSED(etimes = seconds)、COMMAND、USER、TT(感谢 @ahoffman)
  • 使用 awk 打印 PID,其中第 4 列($4,USER)包含文本“builder”,第 5 列($5,TT)包含文本“pts”,并且 ELAPSED 列的值大于 600 秒(感谢 @amtd)

然后,您可以通过管道将其杀死或进行任何您需要的操作。


poi*_*ige 6

# get elapsed time in seconds, filter our only those who >= 3600 sec
ps axh -O etimes  | awk '{if ($2 >= 3600) print $2}'
Run Code Online (Sandbox Code Playgroud)

如果您愿意,您可以提供要ps在其中查找的 PID 列表,例如:

ps h -O etimes 1 2 3
Run Code Online (Sandbox Code Playgroud)

  • `etimes` 仅适用于较新的 `ps` (2认同)