我们如何编写脚本来杀死PID(If else循环)?

我们如何编写脚本来杀死PID(If else循环)?

我有一个包含多个 PID 的文件,如下所示。

#cat /scripts/pid.txt
12345
23456
34567
45678

我必须编写一个脚本,它将从上面的文件中一一读取 PID 并杀死它们。如果脚本卡住并且任何 PID 没有被杀死,则脚本应该退出并进行下一个 PID 杀死。

这是我的脚本:

filename_java=/scripts/pid.txt
cat ${filename_java} | while read line
do

echo "The $line PID is still running" >> 
$TC_LOGS/killing_pid_aftershutdown_$DATE.txt
echo "killing the PID $line " >> 
$TC_LOGS/killing_pid_aftershutdown_java_$DATE.txt
kill -15 $line && sleep 5
mail -s "Admin console is shutdown gracefully" -r $LOGNAME@$HOSTNAME <email 
id> < /dev/null

done

在一一读取 pid 之前,我们应该检查文件是否具有该 PID,如果是,则杀死它们,如果不退出。

谢谢桑托什·G。

答案1

在微不足道的层面上,我不完全确定为什么这还不够。

[[ -s "/scripts/pid_$DATE.txt" ]] && kill $(cat "/scripts/pid_$DATE.txt")

或者你只需​​要杀死第一个,而不要管其他人?

if [[ -s "/scripts/pid_$DATE.txt" ]] 
then
    while IFS= read -r pid
    do
        kill "$pid" && break
    done <"$scripts/pid_$DATE.txt"
fi

在这两种情况下,都假设脚本具有足够的权限来向目标进程发出信号,并且该"$scripts/pid_$DATE.txt"文件要么不存在,要么受信任并且是最新的。

答案2

不太清楚,但“杀”不会卡住,所以,

while read pid; do kill "$pid"; done < "/scripts/pid_$DATE.txt"

或者添加-9来kill来暴力杀死你的进程

答案3

其他答案显示了您应该做什么,但并没有真正回答您的问题。那么,就这样吧。

要检查 pid 是否存在,请运行ps p $pid并检查返回代码。

所以你可以这样做:

if ps p $pid; then
    kill $pid
fi

或者

ps p $pid && kill $pid

读取文件:

while IFS= read -r pid
do
    ps p $pid && kill "$pid"
done < "/scripts/pid_$DATE.txt"

或使用xargs代替循环:

xargs -a "/scripts/pid_$DATE.txt" -I{} sh -c '
    ps p $1 > /dev/null 2>&1 && kill $1
' xargs-sh {}

正如其他人指出的那样,所有这一切都是不必要的,因为您kill可能陷入困境的前提是错误的。

相关内容