2012-09-04 43 views
13

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

简单地说,就像watch -cmd "./the_process -arg" deps/*那样很好。

更新: 一个简单的shell脚本所提出的inotify工具一起适合我的需要(适用于命令W/O参数)(太好了!):

#!/bin/sh 
while true; do 
    [email protected] & 
    PID=$! 
    inotifywait $1 
    kill $PID 
done 
+0

有人可以解释什么是“$!”请(不能用Google找到它),谢谢。 – Lior

+1

它返回先前启动的进程的ID – Christian

+1

如果文件系统没有'noatime'属性,则由于'access'事件,目标脚本/进程将在无限循环中重新启动。要解决这个问题,请使用'inotifywait -e修改$ 1',而这只会对文件修改事件做出反应。 – chronos

回答

11

是的,你可以观看目录通过inotify系统使用inotifywaitinotifywatchinotify-tools

inotifywait将在检测到事件时退出。通过选项-r以递归方式观看目录。例如:inotifywait -r mydirectory

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

+0

你能提供一个例子吗? – Jon

+1

@Jon我添加了一个'inotifywait'的例子,它似乎比'inotifywatch'更适合这个任务。 – scai

7

退房iWatch

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

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

iwatch /path/to/file -c 'run_you_script.sh' 
+0

也许这是更好的答案,但我更喜欢使用inotify工具的DIY解决方案。 – Christian

5

这是对这个问题提供了答案的改善。当中断脚本时,运行过程应该被终止。

#!/bin/sh 

sigint_handler() 
{ 
    kill $PID 
    exit 
} 

trap sigint_handler SIGINT 

while true; do 
    [email protected] & 
    PID=$! 
    inotifywait -e modify -e move -e create -e delete -e attrib -r `pwd` 
    kill $PID 
done 
+1

谢谢!请注意,如果您想触摸somefile触发重新启动,您必须添加'-e attrib'。 – seanf

相关问题