Monit Bund Exec Rails с

У меня есть следующий сценарий оболочки, который позволяет мне запустить мое приложение 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 для его установки, и последняя версия из репозитория 5.16, так как я работаю на Ubuntu 16.04, также обратите внимание, что monit работает от имени root, поэтому я указал gid uid в следующий. (потому что стартовый скрипт используется для выполнения от "пользователя", а не от "root")

Вот конфигурация для монитора:

  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 обнаруживает и предупреждает меня, когда процесс останавливается (если я убиваю его вручную) и когда он восстанавливается вручную, но он не запускает этот сценарий оболочки автоматически.. и согласно /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 пытается выполнить скрипт, я вижу, что он пытается загрузить его (я могу увидеть его менее чем за 3 секунды, используя ps aux | grep -v grep | grep ":4445", но этот вывод отличается от Приведенный выше вывод, который я показал, показывает содержимое выполняемого сценария оболочки, а именно:

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

и тогда оно исчезает. затем он пытается повторно выполнить оболочку.. снова и снова... Что мне не хватает, и что не так с моей конфигурацией? обратите внимание, что я не могу ничего изменить в start-app.sh, потому что он работает и работает на 100%. (я просто хочу следить за этим)

Редактировать: Насколько я понимаю, мне кажется, что это проблема переменной среды или проблема пути, но я не уверен, как ее решить, нет смысла помещать переменные env в monit... что если кто-то еще хотел отредактировать этот скрипт или добавить что-то новое? я надеюсь, что вы поняли мою точку зрения

1 ответ

Решение

Как я и ожидал, это была проблема пользовательской среды, и я решил ее, отредактировав конфигурацию 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) как "пользователь" из monit, потому что он будет выполнять сценарий оболочки только под именем "пользователь", но не получит / не импортирует / не использует путь env пользователя или переменные env.

Другие вопросы по тегам