我们如何杀死所有超过特定年龄的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秒。