2012-09-04 66 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

相關問題