我们如何杀死所有超过特定年龄的Linux进程?

时间:2020-03-05 18:38:39  来源:igfitidea点击:

我在某个服务器上的某些类似于僵尸的进程存在问题,需要时不时地将其杀死。我如何最好地识别运行时间超过一个小时左右的设备?

解决方案

回答

使用ps是正确的方法。我之前已经做过类似的事情,但是没有方便的来源。
通常,ps有一个选项可以告诉它要显示的字段和排序的字段。我们可以按运行时间对输出进行排序,grep所需的进程,然后将其终止。

高温超导

回答

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

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

回答

找到了一个对我有用的答案:

警告:这将发现并杀死长时间运行的进程

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

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

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

回答

这样,我们可以获得十个最旧进程的列表:

ps -elf | sort -r -k12 | head -n 10

回答

执行ps -aef。这将向我们显示该过程开始的时间。然后使用" date"命令找到当前时间。计算两者之间的差异,以找到流程的期限。

回答

Perl的Proc :: ProcessTable将达到目的:
http://search.cpan.org/dist/Proc-ProcessTable/

我们可以使用sudo apt-get install libproc-processtable-perl将其安装在debian或者ubuntu中。

这里是单线:

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, "\n" } }'

或者,将其格式化后,将其放在一个名为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, "\n";
    }
}

然后运行perl process.pl

这为我们提供了更多功能,并且启动时间为1秒。