2016-09-22 47 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