首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >如何杀死所有早于某个时间的Linux进程?

如何杀死所有早于某个时间的Linux进程?
EN

Stack Overflow用户
提问于 2008-08-08 16:50:47
回答 11查看 88.6K关注 0票数 67

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

EN

回答 11

Stack Overflow用户

回答已采纳

发布于 2012-05-10 07:50:32

如果他们只需要被杀死:

代码语言:javascript
复制
if [[ "$(uname)" = "Linux" ]];then killall --older-than 1h someprocessname;fi

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

代码语言:javascript
复制
if [[ "$(uname)" = "Linux" ]];then killall -i --older-than 1h someprocessname;fi

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

票数 34
EN

Stack Overflow用户

发布于 2008-08-08 16:56:57

对于任何超过一天的东西,

代码语言:javascript
复制
ps aux

将给你答案,但它下降到天的精度,这可能不是那么有用。

代码语言:javascript
复制
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日以来一直在运行,但没有显示它启动的时间。

代码语言:javascript
复制
stat /proc/<pid>

会给你一个更准确的答案。例如,下面是进程1的确切时间戳,ps仅将其显示为Jun22:

代码语言:javascript
复制
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
票数 22
EN

Stack Overflow用户

发布于 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中安装它

下面是一行代码:

代码语言:javascript
复制
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的文件中:

代码语言:javascript
复制
#!/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秒的开始时间分辨率。

票数 7
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/6134

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档