杀死所有分离的进程



我有一个脚本,从Unsplash获取壁纸,然后设置它。我设置了一个标志--repeat,以便根据指定的间隔连续获取图像。脚本功能完美但实现这个我用& disown分离流程,使其保持在后台运行

我的问题是试图杀死旧的进程(es)当我再次运行脚本。我曾经使用kill $(ps -ef | awk '/script_name/{print $2}')来杀死现有的进程。当然这样做,我不能推荐任何人使用这个脚本。

while read line ; do
case $line in
*-r*) [[ $line =~ $$ ]] || kill `echo $line | cut -d' ' -f2` ;;
esac
done < <(ps -ef | grep -w 'bg.sh')

我使用这个在上面说的脚本,但作为今天的进程,产卵不是由脚本的名称命名,所以现在我无法找出一种方法来找到他们,更不用说杀死他们;当然会导致上面的代码段停止工作。我试过在脚本的顶部运行kill $!,但我一定是做错了什么。我在网上找到的所有资源只会让我更加困惑

如果您想杀死某个脚本的所有已经运行的实例,您可以在脚本的顶部添加这样的内容;

for pid in $(pidof -x SCRIPT_NAME); do
if [ "$pid" != $$ ]; then
kill "$pid"
fi
done

你也可以尝试用killall代替kill

killall SCRIPT_NAME

可以将进程id存储在.pid文件中。当启动新脚本时,您可以让它读取该文件并终止旧脚本。

的例子:

#!/bin/bash
PIDFILE=/fixed/path/to/script.pid
if [[ -e $PIDFILE ]]; then               # check if the .pid file exists
OLDPID=$(<"$PIDFILE")                # read it
while kill "$OLDPID" 2>/dev/null     # try to kill it
do
sleep 1                          # sleep a little
done
echo "$OLDPID is dead"
fi
# Store the new pid
trap 'rm "$PIDFILE"' EXIT
echo $$ > "$PIDFILE"
# let the script do what it's supposed to do here

你可以添加一个限制,多少次应该尝试杀死旧的脚本,然后做一个kill -0 "$OLDPID"只是为了确认它实际上已经死亡。

最新更新