У меня странная проблема с загрузочным скриптом, который запускает скрипт 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
?