BASH为超过1小时的用户杀死进程

时间:2015-04-15 14:45:40

标签: bash process kill

我正在尝试编写一个单行程序,用于查找超过1小时的用户名的所有进程并将其终止。我有以下内容:

for each in $(find /proc -maxdepth 1 -user hobbyisl -type d -mmin +60 -exec basename {} \;); do kill -9 $file; done

以下部分正确识别流程:

find /proc -maxdepth 1 -user hobbyisl -type d -mmin +60 -exec basename {} \;

运行整件事时,我收到以下错误:

kill: usage: kill [-s sigspec | -n signum | -sigspec] pid | jobspec ... or kill -l [sigspec]

有人可以帮忙吗?

4 个答案:

答案 0 :(得分:4)

在你的循环中,$eacheach不是语法的一部分 - 它是一个变量名)变量包含进程ID,而不是$file

试试:

for each in $(find /proc -maxdepth 1 -user hobbyisl -type d -mmin +60 -exec basename {} \;); do kill -9 $each; done

但是,我建议使用process_id而不是each等变量,因为它可能会导致错误:)

答案 1 :(得分:2)

您的for语句使用变量each。您的kill语句使用变量file。因此,错误。

答案 2 :(得分:0)

这是使用ps,awk,xargs的单线程。将用户root替换为正确的用户echo并从xargs中删除ps -u root -o pid,etime | awk '{split($2,t,":"); split(t[1],t,"-"); if (int(t[2])>1) print $1;}' | xargs -I _ echo kill _ 以便实际终止该进程。

ps -u root -o pid,etime | awk '{split($2,t,":"); n=0; for(i in t) n++; if(n > 2) { split(t[1],a,"-"); j=0; for(i in a) j++; x=a[1]; if(j>1) {x=a[2]} if(int(x)>0) print $1 }}' | xargs -I _ echo kill _

解释一下:

  • pid是流程ID
  • etime是自流程启动以来经过的时间

注意:这将使用超过一天的进程(因为awk中存在拆分)。

更新:有点长awk但是:

{{1}}

答案 3 :(得分:0)

如果您在正在运行的任何发行版中都有此killall命令,则killall -u foo -o 2m bar命令支持此功能:

-u foo

  • foo - 指定用户-o 2m
  • bar - 按超过2分钟的流程进行过滤
  • deps = [":benchmark_model_lib", "//tensorflow/contrib/quantization/kernels:quantized_ops", ], 其他过滤器(仅命令中包含'foo'的进程)