AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • 主页
  • 系统&网络
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • 主页
  • 系统&网络
    • 最新
    • 热门
    • 标签
  • Ubuntu
    • 最新
    • 热门
    • 标签
  • Unix
    • 最新
    • 标签
  • DBA
    • 最新
    • 标签
  • Computer
    • 最新
    • 标签
  • Coding
    • 最新
    • 标签
主页 / server / 问题 / 71360
Accepted
Ryaner
Ryaner
Asked: 2009-10-06 06:32:48 +0800 CST2009-10-06 06:32:48 +0800 CST 2009-10-06 06:32:48 +0800 CST

查找(并杀死)旧进程

  • 772

基本上我需要能够扫描进程树并找到与某个名称匹配并开始运行一周以上的进程。一旦我拥有它们,我需要杀死它们。所有进程仍然被系统视为处于运行状态,只是不使用任何系统时间。他们通常也会永远处于这种状态。

理想情况下,我希望找到类似的东西,但对于流程。

系统是 Debian linux,这将由 cron 编写脚本和运行,所以我对一些大但可以理解的东西没有真正的问题。

linux
  • 7 7 个回答
  • 34688 Views

7 个回答

  • Voted
  1. Best Answer
    Ian Clelland
    2009-10-06T07:25:45+08:002009-10-06T07:25:45+08:00

    你可以结合 ps 、 awk 和 kill 来做到这一点:

    ps -eo pid,etime,comm
    

    为您提供三列输出,其中包含进程 PID、自进程启动以来经过的时间和命令名称,不带参数。经过的时间看起来像以下之一:

    mm:ss
    hh:mm:ss
    d-hh:mm:ss
    

    由于您想要运行超过一周的进程,因此您将寻找与第三个模式匹配的行。您可以使用 awk 通过运行时间和命令名称过滤掉进程,如下所示:

    ps -eo pid,etime,comm | awk '$2~/^7-/ && $3~/mycommand/ { print $1 }'
    

    这将打印所有与“mycommand”匹配的命令的 pid,这些命令已经运行了 7 天以上。将该列表导入 kill 中,您就完成了:

    ps -eo pid,etime,comm | awk '$2~/^7-/ && $3~/mycommand/ { print $1 }' | kill -9
    
    • 9
  2. billyw
    2016-04-16T13:00:52+08:002016-04-16T13:00:52+08:00

    killall --quiet --older-than 1w process_name

    • 6
  3. EEAA
    2009-10-06T06:45:03+08:002009-10-06T06:45:03+08:00

    您需要的所有信息都可以从ps -ef. 请参阅“时间”列。grep将其与整理出您需要的流程相结合。此时,您可以使用cut获取所有匹配进程的 pid 并将它们传递给kill.

    如果您想了解有关如何执行此操作的更多详细信息,请告诉我。

    • 1
  4. Earl Ruby
    2020-05-08T10:25:12+08:002020-05-08T10:25:12+08:00

    如果您有一个要杀死的 Python/Perl/Ruby 脚本,killall那将无济于事,因为killall只会查找“python”或“perl”,它无法匹配特定脚本的名称。

    要杀死所有超过 X 秒且完整运行命令的任何部分与字符串匹配的进程,您可以以 root 身份运行:

    MAX_SECONDS=43200
    PROGRAM_THAT_NEEDS_TO_DIE=bad-python-script.py
    ps -eo pid,etimes \
        | grep -v PID \
        | awk '$2>'$MAX_SECONDS'{ print $1 }' \
        | xargs --no-run-if-empty ps -f --pid \
        | grep $PROGRAM_THAT_NEEDS_TO_DIE \
        | awk '{ print $2 }' \
        | xargs --no-run-if-empty kill -9
    

    用于ps获取所有进程的列表 ( -e) 并仅输出 pid 和经过的秒数 ( -o pid,etimes)。

    grep -v PID删除标题行。

    用于awk仅选择经过的秒数大于 43200 秒(12 小时)的行,并仅删除带有 PID 的第一列。

    将 PID 列表传回ps以获取完整的进程列表。

    用于grep查找包含要终止的脚本名称的行。

    再次使用awk拉出脚本的PID。

    如果找到任何进程,请杀死它们。

    • 1
  5. user56439
    2010-10-08T08:27:45+08:002010-10-08T08:27:45+08:00

    如果您是 root,请清除垃圾( /proc/fs proc/stat ...)

    find /proc -maxdepth 1 -regex '/proc/[0-9]*' -type d -mtime +2 -exec basename {} \;
    
    • 0
  6. Phil Hollenback
    2011-01-24T12:04:48+08:002011-01-24T12:04:48+08:00

    这里没有人提到ps-watcher。我认为您可以使用 elapsed2sec 函数比较 $start_time ,但我不完全确定。这是我的第一个想法:

    [myproc]
    occurs = every
    trigger = elapsed2secs('$start_time') > 7*DAYS
    action = <<EOT
      echo "$command has been running more than 7 days" | /bin/mail user\@host
      kill -TERM $pid
    EOT
    

    不知道这是否有效,但这应该是一个很好的起点。

    • 0
  7. dogbane
    2009-10-06T06:47:38+08:002009-10-06T06:47:38+08:00

    当一个进程启动时,它会在 /proc 文件系统中创建一个目录。您可以使用 find 命令获取超过 7 天的目录并终止进程,如下所示:

    find /proc -user myuser -maxdepth 1 -type d -mtime +7 -exec basename {} \; | xargs kill -9 
    
    • -1

相关问题

  • Linux 主机到主机迁移

  • 如何在 Linux 机器上找到有关硬件的详细信息?

  • 如何在 Linux 下监控每个进程的网络 I/O 使用情况?

  • 在 RHEL4 上修改 CUPS 中的现有打印机设置

  • 为本地网络中的名称解析添加自定义 dns 条目

Sidebar

Stats

  • 问题 205573
  • 回答 270741
  • 最佳答案 135370
  • 用户 68524
  • 热门
  • 回答
  • Marko Smith

    SFTP 使用什么端口?

    • 6 个回答
  • Marko Smith

    从 IP 地址解析主机名

    • 8 个回答
  • Marko Smith

    如何按大小对 du -h 输出进行排序

    • 30 个回答
  • Marko Smith

    命令行列出 Windows Active Directory 组中的用户?

    • 9 个回答
  • Marko Smith

    Windows 中执行反向 DNS 查找的命令行实用程序是什么?

    • 14 个回答
  • Marko Smith

    如何检查 Windows 机器上的端口是否被阻塞?

    • 4 个回答
  • Marko Smith

    我应该打开哪个端口以允许远程桌面?

    • 9 个回答
  • Marko Smith

    什么是 Pem 文件,它与其他 OpenSSL 生成的密钥文件格式有何不同?

    • 3 个回答
  • Marko Smith

    如何确定bash变量是否为空?

    • 15 个回答
  • Martin Hope
    MikeN 在 Nginx 中,如何在维护子域的同时将所有 http 请求重写为 https? 2009-09-22 06:04:43 +0800 CST
  • Martin Hope
    Tom Feiner 如何按大小对 du -h 输出进行排序 2009-02-26 05:42:42 +0800 CST
  • Martin Hope
    0x89 bash中的双方括号和单方括号有什么区别? 2009-08-10 13:11:51 +0800 CST
  • Martin Hope
    kch 如何更改我的私钥密码? 2009-08-06 21:37:57 +0800 CST
  • Martin Hope
    Kyle Brandt IPv4 子网如何工作? 2009-08-05 06:05:31 +0800 CST
  • Martin Hope
    Noah Goodrich 什么是 Pem 文件,它与其他 OpenSSL 生成的密钥文件格式有何不同? 2009-05-19 18:24:42 +0800 CST
  • Martin Hope
    Brent 如何确定bash变量是否为空? 2009-05-13 09:54:48 +0800 CST
  • Martin Hope
    cletus 您如何找到在 Windows 中打开文件的进程? 2009-05-01 16:47:16 +0800 CST

热门标签

linux nginx windows networking ubuntu domain-name-system amazon-web-services active-directory apache-2.4 ssh

Explore

  • 主页
  • 问题
    • 最新
    • 热门
  • 标签
  • 帮助

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve