我在某个服务器上遇到了一些僵尸进程的问题,这些进程需要时不时地被终止。我如何才能最好地识别运行时间超过一个小时左右的那些?
发布于 2012-05-10 07:50:32
如果他们只需要被杀死:
if [[ "$(uname)" = "Linux" ]];then killall --older-than 1h someprocessname;fi
如果你想看看它匹配的是什么
if [[ "$(uname)" = "Linux" ]];then killall -i --older-than 1h someprocessname;fi
对于每个进程匹配,-i
标志将提示您是/否。
发布于 2008-08-08 16:56:57
对于任何超过一天的东西,
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
发布于 2010-08-13 15:19:40
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秒的开始时间分辨率。
https://stackoverflow.com/questions/6134
复制相似问题