Monit捆绑exec rails s

我有以下shell脚本,允许我启动我的rails应用程序,让我们说它叫做start-app.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] 

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

现在来monit,我使用apt-get来安装它,而repo的最新版本是5.16 ,因为我在Ubuntu 16.04上运行,还注意到monit以root身份运行,这就是为什么我指定了gid uid以下。 (因为启动脚本用于从“user”而不是“root”执行)

这是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 

到目前为止,当monit尝试执行脚本时我看到的是它尝试加载它(我可以使用ps aux | grep -v grep | grep“:4445”看到它不到3秒,但此输出不同于上面的输出我出现了,它显示了正在执行的shell脚本的内容,特别是这个:

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

然后它消失了。 然后它试图一次又一次地重新执行shell …我错过了什么,我的配置有什么问题? 请注意,我无法在start-app.sh中更改任何内容,因为它是在生产和100%工作。 (我只想监视它)

编辑:根据我的理解和经验,它似乎是一个环境变量问题或路径问题,但我不知道如何解决它,将env变量放在monit中没有任何意义..如果有人怎么办?否则想编辑那个shell脚本或添加新的东西? 我希望你明白我的观点

正如我所料,这是用户环境问题,我通过编辑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" 

说明:我从monit中删除了(uid和gid)作为“user” ,因为它只会以“user”的名义执行shell脚本,但它不会获取/ import / use 用户的 env路径或env变量。