Рубиновый фоновый процесс STDOUT пуст - PullRequest
0 голосов
/ 27 июня 2011

У меня странная проблема с загрузочным скриптом, который запускает скрипт Sinatra с помощью функции оболочки "daemon".Проблема в том, что когда я запускаю команду в командной строке, я получаю вывод в STDOUT.Если я запускаю команду в командной строке точно так же, как в сценарии - за исключением части демона - вывод правильно перенаправляется в выходной файл.Однако, когда его запускает скрипт запуска (см. Ниже), я получаю данные в журнал STDERR, но не в журнал STDOUT.

Соответствующие строки скрипта:

#!/bin/sh
# (which is and has been a symlink to /bin/bash

# Source function library.
. /etc/init.d/functions

# Set Some Variables
RUNAS="joeuser"
PID=/var/run/myapp.pid
LOG="/var/log/myapp/app-out.log"
ERR_LOG="/var/log/myapp/app-err.log"
APPLICATION_COMMAND="RAILS_ENV=production ruby /opt/myapp/lib/daemons/my-sinatra-app.rb -p 8002 2>>${ERR_LOG} >>${LOG} &"

# Snip a bunch. This is the applicable line from the "start" case:
daemon --user $RUNAS --pidfile $PID $APPLICATION_COMMAND &> /dev/null

Сейчас, прикольные части:

  • Журнал ошибок записывается правильно через перенаправление STDERR.
  • Если я поменяю порядок >> и 2 >> (I 'м, хватаясь за соломинку, здесь!), поведение не меняется: я все еще получаю STDERR, зарегистрированный правильно, и STDOUT пуст.
  • Если выходной журнал не существует, перенаправление STDOUT создает файл.Но файл остается 0-длины.
  • Это раньше работало.Каталог журнала поддерживается log-rotate.Все последние журналы 'out' имеют длину 0.Старшие не являются.Кажется, что он перестал работать в апреле.Рубиновый код не изменился в любое время;ни один из скриптов запуска не был.

Таким образом, мы запускаем три разных сервиса.Два из них - это рубиновые демоны (один использует sinatra, один - нет), а другой - фоновый процесс Java.Это происходит для ОБА процессов ruby, но не для процесса Java.Может быть, что-то изменилось в Ruby?

FTR, у нас есть ruby ​​1.8.5 и RHEL 5.4.


Я провел еще несколько исследований.Функция daemon делает кучу всего, но суть в том, что она запускает программу, используя runuser.По сути, команда выглядит следующим образом:

runuser -s /bin/bash - joeuser -c "ulimit -S -c 0 >/dev/null 2>&1 ; RAILS_ENV=production ruby /opt/myapp/lib/daemons/my-sinatra-app.rb -p 8002 '</dev/null' '>>/var/log/myapp/app-out.log' '2>>/var/log/myapp/app-err.log' '&'"

Когда я запускаю именно это в командной строке (как с одиночными галочками, так и без них, которые были добавлены где-то вдоль линии), я получаю точно такое же поведение, связанное с винтамипо выходному журналу.Итак, мне кажется, что это проблема того, как ruby ​​(?) Взаимодействует с runuser?

1 Ответ

0 голосов
/ 27 июня 2011

Слишком долго, чтобы добавить комментарий: -)

измените шебанг, добавив #!/bin/sh -x, и убедитесь, что все расширяется в соответствии с вашими ожиданиями. Кроме того, при выполнении из терминала ваш файл .bashrc получен, а при выполнении из скрипта - нет; может быть что-то в вашей среде, которые отличаются. Один из способов выяснить это сделать env из терминала и из скрипта и развести вывод

  • env > env_terminal
  • env > env_script
  • diff env_terminal env_script

Счастливой охоты ...

...