我发出命令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 10986
;kill -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
- 要非常小心,不要杀死系统的守护进程。
- 为什么需要终止 Tony 运行超过一天的进程?
- 发送 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
如果你不需要这个脚本,而只是一次性需求,你也应该签出顶部。 脚步:
- 启动它
- 按年代(设置)
- 转到列,选择开始时间
- 按<排序,选择开始
- 选择要终止的进程空间
- 或者也可以使用\(反斜杠)按进程名称进行过滤。
- 使用以下方法终止进程钾。