我正在尝试编写一个脚本,该脚本在删除python3 -m http.server
某个目录(_site
)然后重新创建时重新启动进程。脚本如下。该函数中有一个 inotify 命令,waitdel
它应该只阻塞直到目录被删除。当它被删除时,执行会继续进行一个简单的轮询等待,直到创建目录,然后服务器重新启动,最后我们又回到等待状态。
问题是,当_site
被删除时, shell 脚本中永远不会退出,即使当我在运行此脚本的同一 bash 提示符下运行inotifywait
完全相同的命令时也会退出,无论是 on还是.DELETE
DELETE_SELF
我已经验证inotifywait
运行了正确的命令,并且服务器进程没有阻止脚本的执行。那么,为什么它没有在脚本中退出?
#!/usr/bin/env bash
# serve.bash --- serve content, respawn server when _site/ is deleted
# bash strict mode
set -euo pipefail
IFS=$'\n\t'
PID=0
DIR="$PWD/_site" # NO FOLLOWING SLASH OR BREAKS INOTIFYWAIT
PIDFILE="$PWD/.server.pid"
die () {
echo $0: error: $@
exit 2
}
say () {
echo $0 \[$(date)\]: $@
}
serve () {
cleanup
old="$PWD"
cd "$DIR" || die Could not cd to "$DIR"
python3 -m http.server 8000 --bind 127.0.0.1 2>&1 &
echo $! > "$PIDFILE"
cd "$old"
}
waitdel () {
while true; do
say Set up watcher for "$DIR"...
inotifywait -e delete_self "$DIR"
say "$DIR" deleted, restarting server...
# Wait&poll till the directory is recreated.
while [ ! -e "$DIR" ]; do
sleep 0.1
done
serve
done
}
cleanup () {
if [[ ! -e "$PIDFILE" ]]; then
return
fi
sync
PID="$(cat $PIDFILE)" && rm "$PIDFILE"
say Kill pid="$PID"...
[ "0" = "$PID" ] || kill -9 "$PID" \
|| die Failed to kill preexisting server on pid "$PID"
}
trap cleanup SIGINT SIGTERM EXIT
if [ -e "$PIDFILE" ]; then
if pgrep -a python3 | grep http\\.server >/dev/null; then
trap - SIGINT SIGTERM EXIT
die Stale pidfile found at "$PIDFILE", a potentially orphaned \
server might be running. Please kill it before proceeding.
else
rm "$PIDFILE" # remove stale pidfile when no server proc found
fi
fi
serve
waitdel