问题:我想确保子进程和父进程都被终止,并回显成功与否。我是 Bash 脚本的新手,我的输出有问题。
#!/bin/bash
for p in $(ps jauxww | grep Z | grep -v PID | awk '{print $3}'); do
for everyone in $(ps auxw | grep $p | grep cron | awk '{print $2}');do
kill -9 $everyone;
echo(Detected zombie process:"$PID". "$usr": . Successfully Killed);
else
echo (Detected zombie process:"$PID". "$usr": . Could not kill);
done;
done;
答案1
您无法杀死僵尸,它已经死了。它只是在父进程读取wait(2)
其退出状态之前在进程表中创建一个条目。
另外,要杀死任何进程(包括僵尸进程)的父进程,您可以轻松使用命令ps
和的组合kill
:
ps -p <pid> -o ppid=
将使用具有 PID(进程 ID)的进程的 PPID(父进程 ID)<pid>
。
例如,要查找具有 PID 的进程的 PPID 2345
:
ps -p 2345 -o ppid=
您可以kill
使用命令替换将其传递给$()
:
kill "$(ps -p 2345 -o ppid=)"
另一方面,要使用其 PPID 终止进程,请使用pkill
:
pkill -P <PPID>
例如,终止具有 PPID 的进程1234
:
pkill -P 1234
此外,除非绝对必要,否则不要使用SIGKILL
(kill -9
),因为它不允许进程进行任何清理,并可能会导致不良影响。