所以,我想创建一个bash脚本,我将在启动时运行它,但是我想更新脚本,如果我需要并在没有重启的情况下运行它,那么我想要什么do是让脚本在加载时检查它是否有任何其他实例正在运行,并且终止脚本以外的任何实例。我希望它检查bash的实例并获取正在运行的脚本的路径,并杀死具有与其自身相同的路径名的脚本的任何实例。我怎么能这样做?
示例:如果我在目录/ foo / bar中运行脚本../tball/script.sh,它将终止运行脚本/foo/tball/script.sh的任何bash实例存在。
答案 0 :(得分:2)
最好的方法是在易失性文件系统中包含进程PID的文件,如下所示:
echo $$ > /run/script.pid
您可以通过检查PID是否存在来进一步优化它:
if [ ! -d /proc/$(< /run/script.pid) ] ; then
rm /run/script.pid
fi
在你的脚本中你应该有这样的东西,在退出时删除文件或者它收到一个杀死进程的信号:
trap "rm -f /run/script.pid" EXIT INT QUIT TERM
编辑:或者您可以将PID附加到一个众所周知的路径名并在保存PID之前使用类似的东西终止所有脚本实例:
kill $(< /run/script.pid) ; sleep 10 ; kill -9 $(< /run/script.pid)
答案 1 :(得分:2)
这是基础
kill_others() {
local mypid=$$ # capture this run's pid
declare pids=($(pgrep -f ${0##*/} # get all the pids running this script
for pid in ${pids[@]/$mypid/}; do # cycle through all pids except this one
kill $pid # kill the other pids
sleep 1 # give time to complete
done
}
declare -i count=0
while [[ $(pgrep -f ${0##*/}|wc -l) -gt 1 ]]; do
kill_outhers
((++count))
if [[ $count -gt 10 ]]; then
echo "ERROR: can't kill pids" >&2
exit 1
fi
done