是否有一个简单的解决方案(使用常见的shell utils,通过大多数发行版提供的util,或者一些简单的python / ...脚本)在某些文件发生变化时重启进程?
如果像watch -cmd "./the_process -arg" deps/*
一样打电话,那就太好了。
更新 一个简单的shell脚本和提议的inotify-tools(很好!)符合我的需求(适用于没有参数的命令):
#!/bin/sh
while true; do
$@ &
PID=$!
inotifywait $1
kill $PID
done
答案 0 :(得分:12)
是的,您可以使用inotify-tools中的inotifywait
或inotifywatch
通过 inotify 系统观看目录。
inotifywait
将在检测到事件时退出。传递选项-r
以递归方式查看目录。示例:inotifywait -r mydirectory
。
您还可以指定要观看的事件,而不是观看所有事件。要仅等待文件或目录内容更改,请使用选项-e modify
。
答案 1 :(得分:9)
这是对问题中提供的答案的改进。当一个人中断脚本时,应该终止运行过程。
#!/bin/sh
sigint_handler()
{
kill $PID
exit
}
trap sigint_handler SIGINT
while true; do
$@ &
PID=$!
inotifywait -e modify -e move -e create -e delete -e attrib -r `pwd`
kill $PID
done
答案 2 :(得分:8)
结帐iWatch
:
Watch是一个实时文件系统监控程序。它是一个用于检测文件系统中的更改并立即报告它的工具。它使用XML格式的简单配置文件,并基于inotify,即Linux内核中的文件更改通知系统。
,你可以轻松地观看文件:
iwatch /path/to/file -c 'run_you_script.sh'
答案 3 :(得分:1)
我发现这非常适合PO要求的完整方案:
ls *.py | entr -r python my_main.py
另请参见http://eradman.com/entrproject/,尽管有一些奇怪的记载。是的,您需要ls
要匹配的文件模式,并将其通过管道传输到entr
可执行文件中。它将运行您的程序,并在任何匹配的文件发生更改时重新运行它。
答案 4 :(得分:1)
我是一个贡献者,有一个perl脚本调用lrrr
(实际上是个很小的重启者)。我每天在工作中使用它。
如果安装了perl和cpanm,则可以使用cpanm App::lrrr
进行安装,然后按以下方式使用它:
lrrr -w dirs,or_files,to-watch your_cmd_here
w标志标记了要监视的文件或目录。当前,如果文件被更改,它会终止您运行的过程,但是我要尽快添加一项功能来切换该文件。
请让我知道是否要添加任何内容!
答案 5 :(得分:0)
我使用这个“one liner”根据文件更改重新启动长时间运行的进程
trap 'kill %1' 1 2 3 6; while : ; do YOUR_EXE & inotifywait -r YOUR_WATCHED_DIRECTORY -e create,delete,modify || break; kill %1; sleep 3; done
这将启动进程,将其输出保持到同一个控制台,观察变化,如果有变化,它将关闭进程,等待三秒钟(在同一秒内进一步写入或进程关闭时间) ,然后再次执行上述操作。
ctrl-c 和 ssh-disconnect 将得到遵守,一旦您完成,该过程将退出。
为了便于阅读:
trap 'kill %1' 1 2 3 6
while :
do
YOUR_EXE &
inotifywait \
-r YOUR_WATCHED_DIRECTORY \
-e create,delete,modify \
|| break
kill %1
sleep 3
done
例如对于 package.json-ran 项目
"module" : "./dist/server.mjs",
"scripts" : {
"build" : "cd ./src && rollup -c ",
"watch" : "cd ./src && rollup -c -w",
"start" : "cd ./dist && node --trace-warnings --enable-source-maps ./server.mjs",
"test" : "trap 'kill %1' 1 2 3 6; while : ; do npm run start & inotifywait -r ./dist -e create,delete,modify || break; kill %1; sleep 3; done"
},
"dependencies" : {
现在您可以在一个活动中运行 npm run watch
(从 src 编译到 dist),在另一个活动中运行 npm run test
(服务器运行程序和重启程序),并且在编辑 ./src
文件时构建器进程将更新 ./dist
,服务器将重新启动以供您测试。