如何终止所有超过一定年龄的 Linux 进程?

2024-11-12 08:36:00
admin
原创
21
摘要:问题描述:我遇到了一个问题,某个服务器上有一些僵尸进程,需要不时地终止它们。我如何才能最好地识别那些运行时间超过一小时左右的进程?解决方案 1:如果他们只是需要被杀死:if [[ "$(uname)" = "Linux" ]];then killall --older-...

问题描述:

我遇到了一个问题,某个服务器上有一些僵尸进程,需要不时地终止它们。我如何才能最好地识别那些运行时间超过一小时左右的进程?


解决方案 1:

如果他们只是需要被杀死:

if [[ "$(uname)" = "Linux" ]];then killall --older-than 1h someprocessname;fi

如果你想看看它匹配的是什么

if [[ "$(uname)" = "Linux" ]];then killall -i --older-than 1h someprocessname;fi

对于每个进程匹配,该-i标志都会提示您是/否。

解决方案 2:

找到了适合我的答案:

警告:这将查找并终止长时间运行的进程

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

(其中user-id是具有长时间运行进程的特定用户的 ID。)

第二个正则表达式匹配具有可选天数数字的时间,后跟小时、分钟和秒部分,因此长度至少为一小时。

解决方案 3:

对于超过一天的任何事情,

ps aux

会给出答案,但它会下降到日精度,这可能不那么有用。

USER       PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND
root         1  0.0  0.0   7200   308 ?        Ss   Jun22   0:02 init [5]
root         2  0.0  0.0      0     0 ?        S    Jun22   0:02 [migration/0]
root         3  0.0  0.0      0     0 ?        SN   Jun22   0:18 [ksoftirqd/0]
root         4  0.0  0.0      0     0 ?        S    Jun22   0:00 [watchdog/0]

如果您使用的是 Linux 或其他具有 /proc 文件系统的系统,在此示例中,您只能看到进程 1 自 6 月 22 日以来一直在运行,但没有显示其启动时间。

stat /proc/<pid>

会给你更精确的答案。例如,这是进程 1 的精确时间戳,ps 仅显示为 Jun22:

ohm ~$ stat /proc/1
  File: `/proc/1'
  Size: 0               Blocks: 0          IO Block: 4096   directory
Device: 3h/3d   Inode: 65538       Links: 5
Access: (0555/dr-xr-xr-x)  Uid: (    0/    root)   Gid: (    0/    root)
Access: 2008-06-22 15:37:44.347627750 -0700
Modify: 2008-06-22 15:37:44.347627750 -0700
Change: 2008-06-22 15:37:44.347627750 -0700

解决方案 4:

通过这种方式,您可以获得十个最古老的进程的列表:

ps -elf | 排序 -r -k12 | head -n 10

解决方案 5:

Jodie C 和其他人指出killall -i可以使用,如果您想使用进程名称来终止进程,这没问题。但是如果您想使用与 相同的参数来终止进程pgrep -f,则需要使用类似下面的命令,使用纯 bash 和/proc文件系统。

#!/bin/sh                                                                                                                                               

max_age=120 # (seconds)                                                                                                                                 
naughty="$(pgrep -f offlineimap)"                                                                                                                       
if [[ -n "$naughty" ]]; then # naughty is running                                                                                                       
  age_in_seconds=$(echo "$(date +%s) - $(stat -c %X /proc/$naughty)" | bc)                                                                              
  if [[ "$age_in_seconds" -ge "$max_age" ]]; then # naughty is too old!                                                                                 
    kill -s 9 "$naughty"                                                                                                                                
  fi                                                                                                                                                    
fi     

max_age这使您可以使用完整的进程名称查找并终止超过几秒的进程;即,/usr/bin/python2 offlineimap可以通过引用“offlineimap”来终止命名的进程,而killall此处介绍的解决方案仅适用于字符串“python2”。

解决方案 6:

Perl 的 Proc::ProcessTable 可以解决问题:
http://search.cpan.org/dist/Proc-ProcessTable/

你可以在 debian 或 ubuntu 中使用以下命令安装它sudo apt-get install libproc-processtable-perl

以下是一行代码:

perl -MProc::ProcessTable -Mstrict -w -e 'my $anHourAgo = time-60*60; my $t = new Proc::ProcessTable;foreach my $p ( @{$t->table} ) { if ($p->start() < $anHourAgo) { print $p->pid, "
" } }'

或者,更加格式化地将其放入名为 process.pl 的文件中:

#!/usr/bin/perl -w
use strict;
use Proc::ProcessTable;
my $anHourAgo = time-60*60;
my $t = new Proc::ProcessTable;
foreach my $p ( @{$t->table} ) {
    if ($p->start() < $anHourAgo) {
        print $p->pid, "
";
    }
}

然后运行perl process.pl

这为您提供了更多的灵活性和 1 秒的启动时间分辨率。

解决方案 7:

您可以使用bcmob 的答案中的两个命令来连接它们,并获取自该过程启动以来经过了多少秒:

echo `date +%s` - `stat -t /proc/<pid> | awk '{print $14}'` | bc

编辑:

在等待漫长的进程运行时感到无聊,经过几分钟的摆弄后得到了以下结果:

#file: sincetime
#!/bin/bash
init=`stat -t /proc/$1 | awk '{print $14}'`
curr=`date +%s`
seconds=`echo $curr - $init| bc`
name=`cat /proc/$1/cmdline`
echo $name $seconds

如果你把它放在你的路径上并像这样调用它:

它将打印进程的命令行和自启动以来的秒数。您也可以将其放入路径中:

#file: greptime
#!/bin/bash
pidlist=`ps ax | grep -i -E $1 | grep -v grep | awk '{print $1}' | grep -v PID | xargs echo`
for pid in $pidlist; do
    sincetime $pid
done

然后如果你运行:

greptime <pattern>

其中 patterns 是一个字符串或扩展的正则表达式,它将打印出与该模式匹配的所有进程以及它们启动以来的秒数。:)

解决方案 8:

执行 a ps -aef。这将显示进程启动的时间。然后使用命令datefind 当前时间。计算两者之间的差值以找出进程的年龄。

解决方案 9:

我做了一些类似于接受的答案的事情,但略有不同,因为我想根据进程名称和运行超过 100 秒的坏进程进行匹配

kill $(ps -o pid,bsdtime -p $(pgrep bad_process) | awk '{ if ($RN > 1 && $2 > 100) { print $1; }}')

解决方案 10:

stat -t /proc/<pid> | awk '{print $14}'

获取进程的启动时间(以纪元以来的秒数计算)。与当前时间 ( date +%s) 进行比较,获取进程的当前年龄。

解决方案 11:

使用 ps 是正确的方法。我之前已经做过类似的事情,但手边没有源代码。通常 - ps 有一个选项可以告诉它显示哪些字段以及按哪个字段排序。您可以按运行时间对输出进行排序,grep 所需的进程,然后终止它。

高血压

解决方案 12:

如果有人在 C 中需要这个,你可以使用 readproc.h 和 libproc:

#include <proc/readproc.h>
#include <proc/sysinfo.h>

float
pid_age(pid_t pid)
{
        proc_t proc_info;
        int seconds_since_boot = uptime(0,0);
        if (!get_proc_stats(pid, &proc_info)) {
                return 0.0;
        }

        // readproc.h comment lies about what proc_t.start_time is. It's
        // actually expressed in Hertz ticks since boot

        int  seconds_since_1970 = time(NULL);
        int time_of_boot = seconds_since_1970 - seconds_since_boot;
        long  t = seconds_since_boot - (unsigned long)(proc_info.start_time / Hertz);

        int delta = t;
        float days = ((float) delta / (float)(60*60*24));
        return days;
}

解决方案 13:

在某个地方偶然发现的……觉得它简单又实用

您可以直接使用 crontab 中的命令,

* * * * * ps -lf | grep "user" |  perl -ane '($h,$m,$s) = split /:/,$F
+[13]; kill 9, $F[3] if ($h > 1);'

或者,我们可以将其写成 shell 脚本,

#!/bin/sh
# longprockill.sh
ps -lf | grep "user" |  perl -ane '($h,$m,$s) = split /:/,$F[13]; kill
+ 9, $F[3] if ($h > 1);'

并将其命名为 crontab,如下所示,

* * * * * longprockill.sh

解决方案 14:

我对sincetime上述内容的理解由@Rafael S. Calsaverini 提供:

#!/bin/bash
ps --no-headers -o etimes,args "$1"

这会反转输出字段:首先是已用时间,然后是包含参数的完整命令。这是首选,因为完整命令可能包含空格。

相关推荐
  为什么项目管理通常仍然耗时且低效?您是否还在反复更新电子表格、淹没在便利贴中并参加每周更新会议?这确实是耗费时间和精力。借助软件工具的帮助,您可以一目了然地全面了解您的项目。如今,国内外有足够多优秀的项目管理软件可以帮助您掌控每个项目。什么是项目管理软件?项目管理软件是广泛行业用于项目规划、资源分配和调度的软件。它使项...
项目管理软件   601  
  华为IPD与传统研发模式的8大差异在快速变化的商业环境中,产品研发模式的选择直接决定了企业的市场响应速度和竞争力。华为作为全球领先的通信技术解决方案供应商,其成功在很大程度上得益于对产品研发模式的持续创新。华为引入并深度定制的集成产品开发(IPD)体系,相较于传统的研发模式,展现出了显著的差异和优势。本文将详细探讨华为...
IPD流程是谁发明的   7  
  如何通过IPD流程缩短产品上市时间?在快速变化的市场环境中,产品上市时间成为企业竞争力的关键因素之一。集成产品开发(IPD, Integrated Product Development)作为一种先进的产品研发管理方法,通过其结构化的流程设计和跨部门协作机制,显著缩短了产品上市时间,提高了市场响应速度。本文将深入探讨如...
华为IPD流程   9  
  在项目管理领域,IPD(Integrated Product Development,集成产品开发)流程图是连接创意、设计与市场成功的桥梁。它不仅是一个视觉工具,更是一种战略思维方式的体现,帮助团队高效协同,确保产品按时、按质、按量推向市场。尽管IPD流程图可能初看之下显得错综复杂,但只需掌握几个关键点,你便能轻松驾驭...
IPD开发流程管理   8  
  在项目管理领域,集成产品开发(IPD)流程被视为提升产品上市速度、增强团队协作与创新能力的重要工具。然而,尽管IPD流程拥有诸多优势,其实施过程中仍可能遭遇多种挑战,导致项目失败。本文旨在深入探讨八个常见的IPD流程失败原因,并提出相应的解决方法,以帮助项目管理者规避风险,确保项目成功。缺乏明确的项目目标与战略对齐IP...
IPD流程图   8  
热门文章
项目管理软件有哪些?
云禅道AD
禅道项目管理软件

云端的项目管理软件

尊享禅道项目软件收费版功能

无需维护,随时随地协同办公

内置subversion和git源码管理

每天备份,随时转为私有部署

免费试用