【问题标题】:BASH Kill processes for user older than 1 hourBASH 杀死超过 1 小时的用户的进程
【发布时间】:2015-04-15 14:45:39
【问题描述】:

我正在尝试编写一个单行程序,它可以找到超过 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]

有人可以帮忙吗?

【问题讨论】:

标签: bash process kill


【解决方案1】:

在您的循环中,$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 这样的变量,因为它可能会导致这样的错误:)

【讨论】:

  • ALL_CAPS 变量被“保留”以供 shell 使用,应避免在脚本代码中使用。
【解决方案2】:

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

【讨论】:

  • 哦,我的印象是“每个”是一个函数参数,而不是我的变量。经验教训 - 非常感谢 :)
【解决方案3】:

这是一个使用 ps,awk,xargs 的单行代码。将用户 root 替换为正确的用户并从 xargs 中删除 echo 以实际终止进程。

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 _

稍微解释一下:

  • pid 是进程号
  • etime 是进程启动后经过的时间

注意:这将工作超过一天的进程(因为 awk 中的拆分内容)。

更新:awk 有点长,但是:

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 _

【讨论】:

    【解决方案4】:

    killall 命令本身支持此功能,如果您在运行的任何发行版中都有此功能:

    killall -u foo -o 2m bar

    • -u foo - 指定用户 foo
    • -o 2m - 按超过 2 分钟的进程过滤
    • bar 附加过滤器(仅限命令中包含 'foo' 的进程)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-05-03
      • 2012-09-27
      • 2016-01-24
      • 1970-01-01
      • 1970-01-01
      • 2011-07-06
      • 2019-12-09
      相关资源
      最近更新 更多