首先,是的,我见过这个问题:
那里的答案是错误的,没有用。我已投票并发表了相应的评论。
我想要终止的进程如下所示ps aux | grep page.py
:
apache 424 0.0 0.1 6996 4564 ? S 07:02 0:00 /usr/bin/python2.6 /u/apps/pysnpp/current/bin/page.py apache 2686 0.0 0.1 7000 3460 ? S 9 月 10 日 0:00 /usr/bin/python2.6 /u/apps/pysnpp/current/bin/page.py apache 2926 0.0 0.0 6996 1404 ? S 9月2日 0:00 /usr/bin/python2.6 /u/apps/pysnpp/current/bin/page.py apache 7398 0.0 0.0 6996 1400 ? S 9月1日 0:00 /usr/bin/python2.6 /u/apps/pysnpp/current/bin/page.py apache 9423 0.0 0.1 6996 3824 ? S 9 月 10 日 0:00 /usr/bin/python2.6 /u/apps/pysnpp/current/bin/page.py apache 11022 0.0 0.0 7004 1400 ? S 9月1日 0:00 /usr/bin/python2.6 /u/apps/pysnpp/current/bin/page.py apache 15343 0.0 0.1 7004 3788 ? S 9月9日 0:00 /usr/bin/python2.6 /u/apps/pysnpp/current/bin/page.py apache 15364 0.0 0.1 7004 3792 ? S 9月9日 0:00 /usr/bin/python2.6 /u/apps/pysnpp/current/bin/page.py apache 15397 0.0 0.1 6996 3788 ? S 9月9日 0:00 /usr/bin/python2.6 /u/apps/pysnpp/current/bin/page.py apache 16817 0.0 0.1 7000 3788 ? S 9月9日 0:00 /usr/bin/python2.6 /u/apps/pysnpp/current/bin/page.py apache 17590 0.0 0.0 7000 1432 ? S 9月7日 0:00 /usr/bin/python2.6 /u/apps/pysnpp/current/bin/page.py apache 24448 0.0 0.0 7000 1432 ? S 9月7日 0:00 /usr/bin/python2.6 /u/apps/pysnpp/current/bin/page.py apache 30361 0.0 0.1 6996 3776 ? S 9月9日 0:00 /usr/bin/python2.6 /u/apps/pysnpp/current/bin/page.py
我正在寻求设置一个简单的每日 cron,它可以查找并终止任何page.py
超过一小时的进程。
上述问题的答案不起作用,因为它不匹配时间范围,它只匹配从 7 天到 7 天 23 小时 59 分 59 秒运行的进程。我不想杀死运行了 1-2 小时的进程,而是想杀死任何东西比...更棒1小时。
对上述问题的另一个答案是使用find
不起作用,至少在 Gentoo 或 CentOS 5.4 上不起作用,它要么发出警告,要么如果遵循所述警告的建议则不返回任何内容。
答案1
GNU Killall 可以使用进程名称来杀死超过指定年龄的进程。
if [[ "$(uname)" = "Linux" ]];then killall --older-than 1h page.py;fi
答案2
find 并不总是有效,并非每个系统都有可用的 etimes,并且它可能是我的正则表达式新手状态,但我不认为你需要更多的东西:
ps -eo pid,etimes,comm,user,tty | awk '{if ($4 ~ /builder/ && $5 ~ /pts/ && $2>600) print $1}'
- 列出所有进程并提供列 PID、ELAPSED(etimes = 秒)、COMMAND、USER、TT(感谢@ahoffman)
- 使用 awk 打印 PID,其中第 4 列 ($4,USER) 包含文本“builder”,第 5 列 ($5,TT) 包含文本“pts”,并且 ELAPSED 列的值大于 600 秒(感谢@amtd)
然后您可以通过管道将其杀死或执行任何您需要的操作。
答案3
感谢克里斯托弗的回答,我能够将其调整为以下内容:
find /proc -maxdepth 1 -user apache -type d -mmin +60 -exec basename {} \; \
| xargs ps | grep page.py | awk '{ print $1 }' | sudo xargs kill
-mmin
是我缺少的查找命令。
答案4
我认为您可以修改一些先前的答案以满足您的需求。即:
对于文件中的数据(查找.-maxdepth 1-user processuser-type d-mmin +60) do kill -9 $(basename $FILE) # 我无法让 basename 与 find 的 exec 一起工作。如果你知道如何做,请告诉我! 完毕
或者
ps -eo pid,etime,comm | awk'$2!~/^..:..$/ && $3~/page\.py/ { print $1}'| kill -9
我认为第二种方法可能最适合您的需求。 find 版本最终会删除该用户的其他进程
--Christopher Karel