我有一个包含多个 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
可能陷入困境的前提是错误的。