代码之家  ›  专栏  ›  技术社区  ›  Viktova

监视包exec rails

  •  1
  • Viktova  · 技术社区  · 6 年前

    我有下面的shell脚本,允许我启动我的rails应用程序,假设它被调用 开始-应用程序.sh

    #!/bin/bash
    
    cd /var/www/project/current
    . /home/user/.rvm/environments/ruby-2.3.3
    RAILS_SERVE_STATIC_FILES=true RAILS_ENV=production nohup bundle exec rails s -e production -p 4445 > /var/www/project/log/production.log 2>&1 &
    

    上面的文件具有以下权限:

    -rwxr-xr-x  1 user user   410 Mar 21 10:00 start-app.sh*
    

    如果要检查进程,请执行以下操作:

    ps aux | grep -v grep | grep ":4445"
    

    它将提供以下输出:

    user  2960  0.0  7.0 975160 144408 ?       Sl   10:37   0:07 puma 3.12.0 (tcp://0.0.0.0:4445) [20180809094218]
    

    我grep“:4445”的原因是,我在不同端口上运行的进程很少。(针对不同项目)

    现在来到monit,我使用apt-get安装它,repo的最新版本是 5.16条 乌班图16.04 ,还要注意monit是以根用户身份运行的,这就是我在下面指定gid uid的原因。(因为开始脚本是从“用户”而不是“根”执行的)

    以下是monit的配置:

      set daemon 20            # check services at 20 seconds interval
      set logfile /var/log/monit.log
      set idfile /var/lib/monit/id
      set statefile /var/lib/monit/state
    
    
      set eventqueue
          basedir /var/lib/monit/events # set the base directory where events will be stored
          slots 100                     # optionally limit the queue size
    
    
      set mailserver xx.com port xxx
          username "xx@xx.com" password "xxxxxx"
          using tlsv12
          with timeout 20 seconds
    
      set alert xx@xx.com
    
    
      set mail-format {
           from: xx@xx.com
        subject: monit alert -- $EVENT $SERVICE
        message: $EVENT Service $SERVICE
                        Date:  $DATE
                      Action:  $ACTION
                        Host:  $HOST
                 Description:  $DESCRIPTION
      }
    
     set limits {
            programOutput:     51200 B
            sendExpectBuffer:  25600 B
            fileContentBuffer: 51200 B
            networktimeout:    10 s
     }
    
      check system $HOST
        if loadavg (1min) > 4 then alert
        if loadavg (5min) > 2 then alert
        if cpu usage > 90% for 10 cycles then alert
        if memory usage > 85% then alert
        if swap usage > 35% then alert
    
    check process nginx with pidfile /var/run/nginx.pid
            start program = "/bin/systemctl start nginx"
            stop program = "/bin/systemctl stop nginx"
    
    
    check process redis
            matching "redis"
            start program = "/bin/systemctl start redis"
            stop program = "/bin/systemctl stop redis"
    
    check process myapp
        matching ":4445"
        start program = "/bin/bash -c '/home/user/start-app.sh'" as uid "user" and gid "user"
        stop program = "/bin/bash -c /home/user/stop-app.sh" as uid "user" and gid "user"
    
       include /etc/monit/conf.d/*
       include /etc/monit/conf-enabled/*
    

    现在monit正在检测并提醒我进程何时停止(如果我手动终止它)以及何时手动恢复,但它不会自动启动shell脚本。。根据/var/log/monit.log,它显示了以下内容:

    [UTC Aug 13 10:16:41] info     : Starting Monit 5.16 daemon
    [UTC Aug 13 10:16:41] info     : 'production-server' Monit 5.16 started
    [UTC Aug 13 10:16:43] error    : 'myapp' process is not running
    [UTC Aug 13 10:16:46] info     : 'myapp' trying to restart
    [UTC Aug 13 10:16:46] info     : 'myapp' start: /bin/bash
    [UTC Aug 13 10:17:17] error    : 'myapp' failed to start (exit status 0) -- no output
    

    ps aux | grep-v grep | grep:4445“ ,但此输出与我显示的上述输出不同,它显示了正在执行的shell脚本的内容,尤其是此输出:

    blablalba... nohup bundle exec rails s -e production -p 4445
    

    然后就消失了。然后它试图重新执行shell。。一次又一次。。。 开始-应用程序.sh

    编辑:根据我的理解和经验,这似乎是一个环境变量问题或路径问题,但我不确定如何解决,把环境变量放在monit中没有任何意义。。如果其他人想要编辑shell脚本或添加新的内容呢?我希望你明白我的意思

    1 回复  |  直到 6 年前
        1
  •  2
  •   Viktova    6 年前

    如我所料,这是用户环境问题,我通过如下编辑monit配置解决了这个问题:

    之前(不工作)

    check process myapp
        matching ":4445"
        start program = "/bin/bash -c '/home/user/start-app.sh'" as uid "user" and gid "user"
        stop program = "/bin/bash -c /home/user/stop-app.sh" as uid "user" and gid "user"
    

    工作后

    check process myapp
        matching ":4445"
        start program = "/bin/su -s /bin/bash -c '/home/user/start-app.sh' user"
        stop program = "/bin/su -s /bin/bash -c '/home/user/stop-app.sh' user"
    

    (uid和gid)作为“用户” 因为它会 以“user”的名义执行shell脚本,但它不会获取/导入/使用 用户的