Выскочка Ubuntu будет зависать при запуске/остановке/и т. д.

У меня есть несколько сервисов в Ubuntu, которые начнут использовать «выскочку». Они работают в соответствии с запросом, но когда я использую «стоп/старт/перезапуск {myservice}», он зависает (но БУДЕТ делать как запрошено).

Я понимаю, что это как-то связано с разветвлением.

Мои сервисы — это скрипты Python, которые при запуске создают новые потоки. Один скрипт создаст 1 новый поток (и продолжит работу в основном), второй создаст 2 новых потока и продолжит работу в основном, а третий не создаст новых потоков.

Все они висят на команде.

Все используют один и тот же код в /etc/init следующим образом:

description "my service"
version "1.0"
author "my name, 2013"

expect fork

start on runlevel [2345]
stop on runlevel [!2345]
respawn


chdir <to script dir>

exec /usr/bin/python ./scriptname/

как вы думаете, в чем может быть проблема? Имеет ли «вилка» какое-либо отношение к созданию новых потоков?


person JohnMighty    schedule 24.10.2013    source источник


Ответы (2)


Я думаю, вы путаете создание потоков в python с разветвлением Linux. Python будет управлять своими собственными потоками во время работы (при условии, что вы используете обычные конструкции), с точки зрения выскочки он только отслеживает запущенный процесс python, который вы запустили — python должен быть настроен для управления своими собственными дочерними элементами.

Возможное решение 1

Попробуйте полностью удалить пункт expect, а затем перезагрузить компьютер (вы должны перезагрузить компьютер, поскольку выскочка может отслеживать несуществующий PID).

Я видел это зависание запуска/остановки, когда upstart отслеживал несуществующий PID в результате неправильного expect, что было решено путем удаления ожидания и перезагрузки. Вы можете диагностировать это, выполнив status myservice, и upstart сообщит об остановке, а также PID. (Для других пользователей, для которых перезагрузка невозможна, вы можете использовать этот скрипт)

Возможное решение 2

Настройка пользователя с использованием exec su root -c "/usr/bin/python ./scriptname/" (или другого пользователя) решит проблему, если python/ваша программа пытается получить доступ к переменным среды, которые существуют только для сертифицированного пользователя (по умолчанию upstart имеет очень минимальный набор переменных среды)

Примечание

Вы должны попытаться увидеть вывод, чтобы помочь вам отладить. В реальной жизни вы могли бы перейти к logger, однако изменение вашего скрипта на что-то вроде /usr/bin/python ./scriptname/ >> /home/myuser/output.log 2>&1, а затем просмотр содержимого, поможет вам на данный момент.

person Chris Riddell    schedule 22.01.2014
comment
Еще одно замечание: я не думаю, что chdir больше не поддерживается в последней версии выскочки. Вы также должны удалить строфу и вместо этого использовать полный путь к файлу. - person Chris Riddell; 22.01.2014
comment
Нет необходимости перезагружаться, и на самом деле это может быть вредно, если upstart снова зависнет при попытке, просто следуйте рецептам смены PID, изложенным в askubuntu.com/questions/319199/ - person Josip Rodin; 18.12.2015

Да, в самом деле. См. http://upstart.ubuntu.com/cookbook/#id160.

В зависимости от того, разветвляется ли ваше приложение или разветвляется дважды или не разветвляется вообще, вам нужно ожидать разветвления, ожидать демона или ничего соответственно.

person durandal    schedule 26.12.2013