在Linux中重新启动文件更改过程

时间:2012-09-04 13:12:42

标签: linux shell

是否有一个简单的解决方案(使用常见的shell utils,通过大多数发行版提供的util,或者一些简单的python / ...脚本)在某些文件发生变化时重启进程?

如果像watch -cmd "./the_process -arg" deps/*一样打电话,那就太好了。

更新 一个简单的shell脚本和提议的inotify-tools(很好!)符合我的需求(适用于没有参数的命令):

#!/bin/sh
while true; do
  $@ &
  PID=$!
  inotifywait $1
  kill $PID
done

6 个答案:

答案 0 :(得分:12)

是的,您可以使用inotify-tools中的inotifywaitinotifywatch通过 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,服务器将重新启动以供您测试。