同一脚本内,kill 通过 sudo 启动的进程
Charles Chan @ 2024-01-23 #Shell @Linux
问题
简单的说,如下脚本中的kill是不会生效的。
#!/bin/bash
set -x
sudo sleep 10 &
PID=$!
sleep 2
sudo kill $PID
sleep 1
ps aux | grep sleep
参考: Why does kill not work from script, but does work from terminal? 。如果我没理解错的话,原因是:
sudo 不能用来 kill 同一个进程组内的其他进程。
解决方案
这里,使用 setsid 来重置 sleep 进程的进程组(注意:不是 sudo sleep )。
然后,借助曾经在《 Shell脚本中,等待所有子进程/孙进程退出 》中使用过的方法,通过查询 sudo sleep 的子进程的方式 kill 由 sudo 启动的 sleep 进程。
接下来,由于子进程退出(被 kill),sudo sleep 进程也会自动退出。
#!/bin/bash
set -x
sudo setsid sleep 10 &
PID=$!
sleep 2
WPIDs=($(ps -eo pid,ppid \
| awk -v ppid=$PID '{if($2==ppid && $1!=ppid){print $1}}'))
for pid in ${WPIDs[@]} ; do
if ps -p $pid > /dev/null ; then
sudo kill $pid
fi
done
sleep 1
ps aux | grep sleep