2012-05-03 2 views
1

Я вижу проблему в выскочке, где использование подстановки команд внутри строки сценария после запуска вызывает ошибку (отчеты syslog «завершены статусом 1»,), но только во время первоначального запуска системы.Upstart: ошибка при использовании подстановки в пост-старт-скриптовой строфе во время последовательности запуска

Я пробовал использовать почти каждый крюк события запуска под солнцем. локальные файловые системы и net-device-up работали без ошибок около 1/100 попыток, поэтому он выглядит как состояние гонки. Он отлично работает при ручном запуске/остановке. Подстановочные замены команд, которые я видел, запускают ошибку, являются простой кошкой или датой, и я попытался использовать метод $() и обратный путь. Я также пытался использовать сон в предварительном начале, чтобы победить в гонке, но ничего не сделал.

Я запускаю Ubuntu 11.10 на VMWare с хостом Win7. Прошло слишком много часов, чтобы устранить эту проблему уже ... У кого-нибудь есть идеи?

Вот мой файл .conf для справки:

start on runlevel [2345] 
stop on runlevel [016] 

env NODE_ENV=production 
env MYAPP_PIDFILE=/var/run/myapp.pid 

respawn 

exec start-stop-daemon --start --make-pidfile --pidfile $MYAPP_PIDFILE --chuid node-svc --exec /usr/local/n/versions/0.6.14/bin/node /opt/myapp/live/app.js >> /var/log/myapp/audit.node.log 2>&1 

post-start script 
    MYAPP_PID=`cat $MYAPP_PIDFILE` 
    echo "[`date -u +%Y-%m-%dT%T.%3NZ`] + Started $UPSTART_JOB [$MYAPP_PID]: PROCESS=$PROCESS UPSTART_EVENTS=$UPSTART_EVENTS" >> /var/log/myapp/audit.upstart.log 
end script 

post-stop script 
    MYAPP_PID=`cat $MYAPP_PIDFILE` 
    echo "[`date -u +%Y-%m-%dT%T.%3NZ`] - Stopped $UPSTART_JOB [$MYAPP_PID]: PROCESS=$PROCESS UPSTART_STOP_EVENTS=$UPSTART_STOP_EVENTS EXIT_SIGNAL=$EXIT_SIGNAL EXIT_STATUS=$EXIT_STATUS" >> /var/log/myapp/audit.upstart.log 
end script 
+0

Вам не нужна замена команд здесь, 'date' может печатать вещи просто отлично. 'date -u +" [% Y-% M-% Dt% t.3NZ] - начато $ UPSTART_JOB [$ MYAPP_PID]: PROCESS = $ PROCESS UPSTART_EVENTS = $ UPSTART_EVENTS ">>/var/log/myapp/audit.upstart .log' ... при условии, что ваши переменные не содержат каких-либо последствий, которые должны быть экранированы. – tripleee

+0

Правда, я могу избежать подстановки команды для даты, но не для кота, насколько я знаю. Если бы я мог найти способ получить этот PID в записи журнала без подстановки команды, то ваше право сказать, что я мог бы обойти всю проблему. – Egg

ответ

1

Наиболее вероятный сценарий развития событий я могу думать о том, что $MYAPP_PIDFILE не создан.

Поскольку вы не указали строфу 'ожидать', пост-старт запускается, как только основной процесс разворачивается и выполняется. Итак, как вы подозревали, вероятно, существует пробег между start-stop-daemon запущенным узлом и запись этого pidfile и /bin/sh разветвление, выполнение и форсировка снова к exec cat $MYAPP_PIDFILE.

Правильный способ сделать это, чтобы переписать пост-старт как таковой:

post-start script 
    for i in 1 2 3 4 5 ; do 
    if [ -f $MYAPP_PIDFILE ] ; then 
     echo ... 
     exit 0 
    fi 
    sleep 1 
    done 
    echo "timed out waiting for pidfile" 
    exit 1 
end script 

Ее стоит отметить, что в Upstart 1.4 (входит в первую в Ubuntu 12.04), выскочка не добавил регистрации способности, так что нет необходимо перенаправить вывод в специальный файл журнала. Все выходные данные консоли по умолчанию равны /var/log/upstart/$UPSTART_JOB.log (которые вращаются с помощью logrotate). Таким образом, эти эхо могли быть просто эхом.

+0

Мне нравится эта линия мышления, но если я полностью удалю команду cat, присутствие команды date все равно может вызвать ошибку. – Egg

 Смежные вопросы

  • Нет связанных вопросов^_^