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

Chr*_*ian 19 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
Run Code Online (Sandbox Code Playgroud)

sca*_*cai 14

是的,你可以通过看目录的inotify使用系统inotifywaitinotifywatchinotify工具.

inotifywait将在检测到事件时退出.传递选项-r以递归方式查看目录.示例:inotifywait -r mydirectory.

您还可以指定要监视的事件,而不是观看所有事件.要仅等待文件或目录内容更改,请使用选项-e modify.

  • inotify-tools 似乎已经好几年没有更新了。`entr` (@matanster 在下面建议)看起来更最新,并且可能更容易用于 OP 案例 (2认同)

Gar*_*rwe 11

这是对问题中提供的答案的改进.当一个人中断脚本时,应该终止运行过程.

#!/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
Run Code Online (Sandbox Code Playgroud)

  • 聪明!您可能必须删除SIG前缀:`trap sigint_handler INT TERM`. (2认同)
  • 我会删除 `PID=$!` 并将 `kill $PID` 替换为 `kill $(jobs -p)`,以确保它不会杀死其他程序,以防其他程序提前退出。 (2认同)

Kuf*_*Kuf 8

退房iWatch:

Watch是一个实时文件系统监控程序.它是一个用于检测文件系统变化并立即报告它的工具.它使用XML格式的简单配置文件,并基于inotify,Linux内核中的文件更改通知系统.

比,你可以轻松地看文件:

iwatch /path/to/file -c 'run_you_script.sh'
Run Code Online (Sandbox Code Playgroud)


mat*_*ter 5

我发现这非常适合 PO 要求的完整场景:

ls *.py | entr -r python my_main.py 
Run Code Online (Sandbox Code Playgroud)

另请参阅http://eradman.com/entrproject/,尽管记录有点奇怪。是的,您需要ls匹配您想要匹配的文件模式,并将其通过管道传输到entr可执行文件中。它将运行您的程序并在任何匹配的文件发生更改时重新运行它。