如何终止所有日期早于今天的进程?

如何终止所有日期早于今天的进程?

我发出命令ps -aux | grep tony。它显示以下输出

tony    10986  0.0  0.0  33532   464 ?        S    Feb01   0:00 vncconfig -iconic
tony    10988  0.0  0.0  86012   512 ?        S    Feb01   0:00 twm
tony    15553  0.0  0.0  92404  1848 ?        S    10:34   0:00 sshd: tony@pts/34
tony    15554  0.0  0.0  66232  1680 pts/34   Ss+  10:34   0:00 -bash

我想终止所有日期早于今天的死亡进程。

我本可以发出命令kill -9 10986kill -9 10988,但我喜欢在一个命令中执行,而且还有多个待处理的死进程。

任何帮助将非常感激。

答案1

首先,注意乔纳森的建议

现在你已经完成了,尝试一下这样的事情

# Find all process that are owner by "tony"
#  - Print out the process id (pid), and the start time (lstart)
# Find all the rows that aren't for today
# Cut that down to just the first field (process id)
PROCS="$(ps -u tony -o pid,lstart | fgrep -v " $( date '+%a %b %d' )" | cut -d' ' -f1)"

# Run through each process and ask it to shutdown
for PROC in $PROCS
do
    kill -TERM $PROC
done

# Wait for 10 seconds to give the processes time to stop
sleep 10

# Kill off any processes that still exist
for PROC in $PROCS
do
    [ -r /proc/${PROC}/status ] && kill -KILL $PROC
done

虽然您可能实际上并不想这样做。
所有进程都与会话相关联,如果您能找出旧的 VNC 会话是什么,那么您应该能够终止属于该会话的进程,而不仅仅是寻找“旧”进程。

答案2

  1. 要非常小心,不要杀死系统的守护进程。
  2. 为什么需要终止 Tony 运行超过一天的进程?
  3. 发送 SIGKILL (-9) 是残酷的。最好在发送 SIGKILL 之前发送 SIGTERM (15) 和 SIGHUP (1)。SIGHUP 和 SIGTERM 信号使进程有机会清理并在控制下退出;例如,简单地发送 SIGKILL 意味着无法清理锁定文件。

要获取很久以前启动的进程列表,并且进程在时间字段中具有日期而不是时间,您可以使用:

pids=$(ps -aux |
       awk '$1 ~ /^tony$/ && $9 !~ /[0-2]?[0-9]:[0-5][0-9]/ { print $2; }')
for signal in 15 1 9
do
    kill -$signal $pids 2>/dev/null
    sleep 1
done

awk脚本查找以“tony”开头但与第 9 列中的时间不匹配的行 - 它们有日期,因此是“旧的”。如建议的那样,信号发送分为 3 个步骤:终止、挂断、终止。如果小心,您可以将用户名传递给脚本,awk而不是将名称硬编码为tony

答案3

在 Linux 中,你可以使用以下命令查看至少 24 小时前的所有进程

find /proc -name [1-9]* -maxdepth 1 -user tony -mtime +0

然后用类似的东西把它们拿出来

for signal in -TERM -HUP -KILL
do
    kill $signal \
         $(find /proc -name [1-9]* -maxdepth 1 -user tony -mtime +0 | cut -d/ -f3)
    sleep 3
done

解析ps当然是一种选择,但我尽量避免这样做,因为该命令的选项和输出格式在不同的系统之间可能有很大差异。

答案4

如果你不需要这个脚本,而只是一次性需求,你也应该签出顶部。 脚步:

  1. 启动它
  2. 年代(设置)
  3. 转到列,选择开始时间
  4. <排序,选择开始
  5. 选择要终止的进程空间
  6. 或者也可以使用\(反斜杠)按进程名称进行过滤。
  7. 使用以下方法终止进程

相关内容