`inotifywait`不会在带有“-e delete_self”的bash脚本中终止;但在交互式shell中确实如此

`inotifywait`不会在带有“-e delete_self”的bash脚本中终止;但在交互式shell中确实如此,bash,inotify,inotifywait,Bash,Inotify,Inotifywait,我正在尝试编写一个脚本,当某个目录(\u site)被删除然后重新创建时,该脚本将重新启动python3-mhttp.server进程。脚本如下。waitdel函数中有一个inotify命令,该命令应该只在删除目录之前阻塞。当它被删除时,执行将继续进行简单的轮询等待,直到创建目录,然后服务器重新启动,最后我们回到等待状态 问题是,当\u site被删除时,inotifywait永远不会在shell脚本中存在,即使在DELETE和DELETE\u SELF上,当我在相同的bash提示符下运行该脚本

我正在尝试编写一个脚本,当某个目录(
\u site
)被删除然后重新创建时,该脚本将重新启动python3-mhttp.server进程。脚本如下。
waitdel
函数中有一个inotify命令,该命令应该只在删除目录之前阻塞。当它被删除时,执行将继续进行简单的轮询等待,直到创建目录,然后服务器重新启动,最后我们回到等待状态

问题是,当
\u site
被删除时,
inotifywait
永远不会在shell脚本中存在,即使在
DELETE
DELETE\u SELF
上,当我在相同的bash提示符下运行该脚本时,
inotifywait
确实存在相同的命令

我已经验证了运行了正确的
inotifywait
命令,并且服务器进程没有阻止脚本的执行。那么,为什么它没有在脚本中退出呢

#/usr/bin/env bash
#serve.bash---服务内容,删除_site/时重新启动服务器
#bash严格模式
设置-euo管道故障
IFS=$'\n\t'
PID=0
DIR=“$PWD/_site”#在INOTIFYWAIT中没有后续斜杠或中断
PIDFILE=“$PWD/.server.pid”
死(){
echo$0:错误:$@
出口2
}
说(){
回显$0\[$(日期)\]:$@
}
发球(){
清理
old=“$PWD”
cd“$DIR”| | die无法cd到“$DIR”
python3-mhttp.server8000--bind127.0.0.1 2>&1&
echo$!>“$PIDFILE”
cd“$old”
}
韦德尔(){
虽然是真的;做
说为“$DIR”设置观察者。。。
inotifywait-e删除自身“$DIR”
说“$DIR”已删除,正在重新启动服务器。。。
#等待并轮询,直到重新创建目录。
而[!-e“$DIR”];则
睡眠0.1
完成
服务
完成
}
清理(){
如果[[!-e“$PIDFILE”]],则
返回
fi
同步
PID=“$(cat$PIDFILE)”&&rm“$PIDFILE”
说Kill pid=“$pid”。。。
[“0”=“$PID”]| |杀死-9“$PID”\
||die无法终止pid“$pid”上先前存在的服务器
}
陷阱清理SIGINT SIGTERM退出
如果[-e“$PIDFILE”];然后
如果pgrep-a python3 | grep http\\.server>/dev/null;然后
陷阱-SIGINT SIGTERM退出
在“$pidfile”中找到死板的pidfile,这可能是一个孤立文件\
服务器可能正在运行。请在继续之前杀死它。
其他的
rm“$PIDFILE”#在找不到服务器进程时删除过时的PIDFILE
fi
fi
服务
韦德尔

根据@oguz ismail的建议,我已经尝试制作一个能够重现问题的脚本的最低版本,如下所示:

DIR=“$PWD/\u站点”
mkdir-p$DIR
old=“$PWD”
cd“$DIR”| | die无法cd到“$DIR”
python3-mhttp.server8000-bind127.0.0.12>&1&#(1)
cd“$old”
pid=$!
inotifywait-e删除self“$DIR”和(2)
睡眠1
rmdir$DIR
睡眠1
杀死$pid
echo kill#(3)
这里发生了什么:在表达式(1)中,我们启动了一个python http.server进程,其CWD是
$DIR
。如果不是这样,即CWD是
$(dirname$DIR)
,则inotifywait会成功终止。在(3)中,我们清理服务器进程。如果我们终止python进程,inotifywait将终止,如果我们不终止,它不会终止。进程的输出

Setting up watches.
Watches established.
Serving HTTP on 127.0.0.1 port 8000 (http://127.0.0.1:8000/) ...
kill
/home/g/co/gkayaalp.com/www/_site/ DELETE_SELF 
建议inotifywait在(3)之后终止

所以inotifywait挂起是因为
$DIR
很忙(我猜这是因为inotify与inode一起工作,python进程挂起inode,延迟了删除事件的传播)。解决这个问题的一个快速方法是监视父目录。我修改了waitdel,如下所示:

waitdel(){
虽然是真的;做
说为“$DIR”设置观察者。。。
当inotifywait-qq-e删除“$DIR/”时,请执行以下操作:
如果[!-e$DIR];则
说“$DIR”已删除,正在重新启动服务器。。。
#等待并轮询,直到重新创建目录。
而[!-e“$DIR”];则
睡眠0.1
完成
服务
fi
完成
完成
}

现在它跟踪
$DIR/。
上的删除事件,并在每个事件上检查
$DIR
是否已删除。当它运行时,它会等待重新生成目录,然后运行
service
,这会杀死现有的python进程并生成一个新的进程。

根据@oguz ismail的建议,我尝试生成一个可以重现该问题的脚本的最低版本,如下所示:

DIR=“$PWD/\u站点”
mkdir-p$DIR
old=“$PWD”
cd“$DIR”| | die无法cd到“$DIR”
python3-mhttp.server8000-bind127.0.0.12>&1&#(1)
cd“$old”
pid=$!
inotifywait-e删除self“$DIR”和(2)
睡眠1
rmdir$DIR
睡眠1
杀死$pid
echo kill#(3)
这里发生了什么:在表达式(1)中,我们启动了一个python http.server进程,其CWD是
$DIR
。如果不是这样,即CWD是
$(dirname$DIR)
,则inotifywait会成功终止。在(3)中,我们清理服务器进程。如果我们终止python进程,inotifywait将终止,如果我们不终止,它不会终止。进程的输出

Setting up watches.
Watches established.
Serving HTTP on 127.0.0.1 port 8000 (http://127.0.0.1:8000/) ...
kill
/home/g/co/gkayaalp.com/www/_site/ DELETE_SELF 
建议inotifywait在(3)之后终止

所以inotifywait挂起是因为
$DIR
很忙(我猜这是因为inotify与inode一起工作,python进程挂起inode,延迟了删除事件的传播)。解决这个问题的一个快速方法是监视父目录。我修改了waitdel,如下所示:

waitdel(){
虽然是真的;做
说为“$DIR”设置观察者。。。
当inotifywait-qq-e删除“$DIR/”时,请执行以下操作: