2016-09-22 70 views
0

我想在腳本中檢測到配置更改時使用inotifywait重新啓動nginx。問題是,如果我以守護進程模式運行它,它會繼續重新啓動nginx。使用inotifywait進行nginx重啓

腳本是這樣的:

while inotifywait -d -o /var/log/bootstrap.log --format '%T %:e %w' --timefmt '%Y.%m.%d %H:%M:%S' -e modify,create,delete,move,attrib $(find -L /etc/nginx -type f) 
do 
    NGX_STATUS=$(nginx -t 2>&1) 
    NGX_CFG_STATUS=$(echo $NGX_STATUS | grep successful) 
    if [[ $(echo $?) == 0 ]]; then 
     /etc/init.d/nginx restart 
    else 
    echo $NGX_STATUS | tee -a /var/log/bootstrap.log 
    fi 
done 

注:此腳本是泊塢窗入口點腳本的一部分。

+0

'/ var/log/bootstrap.log'中有什麼? – Tim

+0

grep:警告:不推薦使用GREP_OPTIONS;請使用別名或腳本 *重新啓動nginx nginx – zozo6015

回答

0

您可以嘗試下面的腳本。它會檢查是否在執行pyinotify之前安裝它。

import sys 
import pip 
def install(package): 
    pip.main(['install', package]) 
try: 
    import pyinotify 
except ImportError: 
    print 'pyinotify is not installed, installing it now!' 
    install('pyinotify') 
finally: 
    import pyinotify,subprocess 
    def onChange(ev): 
    cmd = ['/bin/systemctl', 'reload', 'nginx.service'] 
    subprocess.Popen(cmd).communicate() 
    wm = pyinotify.WatchManager() 
    wm.add_watch('/etc/nginx/nginx.conf', pyinotify.IN_MODIFY, onChange) 
    notifier = pyinotify.Notifier(wm) 
    notifier.loop() 
0

當您在守護模式(-d選項),它叉到後臺處理,並返回放inotifywait。通過從while循環中調用它,您正在創建許多在後臺運行的inotifywait守護進程。

不通過-d它會工作。

+0

任何想法如何使用-d選項觸發腳本?事情是沒有-d碼頭工人不會啓動腳本。 – zozo6015

+0

你想在後臺運行整個腳本,而不僅僅是'inotifywait'。我不知道如何用docker做到這一點。這將是一個很好的單獨問題。 – Tim