ruby-on-rails - 监控 bundle 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 身份运行,这就是为什么我在下列的。(因为启动脚本用于从“用户”而不是“根”执行)
这是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% 工作。(我只是想监控它)
编辑:根据我的理解和经验,这似乎是环境变量问题或路径问题,但我不知道如何解决它,将环境变量放入 monit 没有任何意义 .. 如果有人怎么办其他人想要编辑那个 shell 脚本或添加一些新的东西?我希望你明白我的意思
解决方案
正如我所料,这是用户环境问题,我通过编辑监视器配置解决了它,如下所示:
之前(不工作)
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)作为“用户”从 monit 中删除,因为它只会以“用户”的名义执行 shell 脚本,但不会获取/导入/使用用户的env 路径或 env 变量。
推荐阅读
- wpf - WPF - DataTrigger 的问题,它只工作一次
- javascript - 我在模式窗口小部件中的条件控件不允许编辑现有条件,但允许创建和保存新条件
- postgresql - Postgres 政策的范围是什么?
- r - Blogdown Hugo Academic 总是产生相对链接
- flutter - 在调用后传递授权标头
- kubectl - 如何使用 kubectl 获取多个服务的状态?
- c++ - 构造函数中的错误处理而不会失败
- kotlin - 从辅助构造函数调用 SuperConstructor
- node.js - npm install 在我的角度项目中不起作用
- angularjs - 如何在一个解决方案中配置捆绑和缩小两个项目,如管理员和用户?