我正在尝试编写一个单行程序,用于查找超过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]
有人可以帮忙吗?
答案 0 :(得分:4)
在你的循环中,$each
(each
不是语法的一部分 - 它是一个变量名)变量包含进程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 _
解释一下:
注意:这将使用超过一天的进程(因为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'的进程)