Демонизация скрипта python в debian с использованием virtualenv

#python #linux #debian #daemon #virtualenv

#python #linux #debian #демон #virtualenv

Вопрос:

Я видел много сценариев для демонизации скрипта python в Linux, но не так много информации о том, как их использовать. Может ли кто-нибудь помочь мне в этом?

В настоящее время у меня есть длинный скрипт python, который прослушивает входящее сообщение в сокете, если это правильный формат, принимает его и затем сохраняет в базе данных. Сам скрипт просто открывает сокет, а затем прослушивает while true (что делает работу!) и выполняет всю работу там.

Чтобы демонизировать его, должен ли я изменить свой текущий скрипт или вызвать его из отдельного скрипта? Я видел примеры обоих, но ни один из них не работал.

Кроме того, я использую virtualenv, что может быть причиной моих проблем, есть какие-либо подсказки по использованию этого с демонизированными сценариями?

Комментарии:

1. демон — это просто программа / скрипт, который постоянно выполняется до тех пор, пока не произойдет событие, и если событие не произойдет (или находится в очереди), он будет находиться в режиме ожидания в течение определенного периода времени … затем повторите…. То, что вы делаете, — это то, что делает демон. Вы просите запустить его в среде, чтобы он всегда работал?

2. Мне нужны различные вещи, которые установлены в virtualenv, для использования скриптом. Я думаю, именно поэтому у меня это пока не работает. Также, как я узнаю, что он запущен? Я читал о вызове ps aux для отображения списка, но я не вижу его там.

Ответ №1:

Создайте сценарий оболочки, который активирует виртуальную среду и запускает ваш скрипт Python в фоновом режиме.

Кроме того, в виртуальной среде должен быть модуль python, из которого вы также можете импортировать и активировать среду. В данный момент у меня не работает virtualenv, поэтому я не могу проверить, где он находится, но найдите activate (или что-то подобное) в виртуальной среде, и вы должны это найти.

Редактировать: Добавлен минимальный скрипт Debian init.d

Абсолютно минимальный скрипт, необходимый для запуска демона при загрузке компьютера, это:

 #!/bin/sh
/path/to/program amp;
  

amp; Запуск программы в фоновом режиме, поэтому она не остановит остальной процесс загрузки.

Для более полного скрипта скопируйте /etc/init.d/skeleton и отредактируйте новый файл. Важной частью для редактирования является блок в начале (между ### BEGIN INIT INFO и ### END INIT INFO , который используется update-rc.d программой), а также переменные NAME , DAEMON и DAEMON_ARGS . Надеюсь, это все, что нужно для создания startup-script.

Активируйте скрипт следующим образом:

 sudo update-rc.d <name of script> defaults
sudo update-rc.d <name of script> enable
  

И для его запуска:

 sudo update-rc.d <name of script> start
  

<name of script> — это просто имя, а не полный путь.

Комментарии:

1. У меня есть файл активации, да, поэтому я пишу скрипт bash? Как мне демонизировать его?

2. @ing0: Может быть, вы имеете в виду, как написать скрипт, который запускается при загрузке компьютера, как и все другие программы в /etc /init.d? Тогда это немного зависит от того, какой дистрибутив Linux вы используете. Попробуйте man update-rc.d , если страница руководства существует, она должна содержать указания на то, как это сделать. Также попробуйте поискать в Google startup script _linuxdist_ .

3. В настоящее время используется вариант debian, все материалы, которые я нашел в Интернете, содержат код, подобный этому: code.activestate.com/recipes/… Не требуется ли такой код?

4. @ing0: Я обновил свой ответ небольшим описанием того, как создать загрузочный скрипт.

5. Большое спасибо. Я дам вам знать, как у меня дела! 🙂

Ответ №2:

 script
  export PYTHONPATH=.:/home/ubuntu/.local/lib/python2.7/site-packages/:/home/ubuntu/python/lib/python2.7/site-packages/
  exec start-stop-daemon --start  --chuid ubuntu --exec /home/ubuntu/python_envs/MyProj/bin/python /home/ubuntu/www/MyProj/MyProj.py -- --config-file-dir=/home/ubuntu/www/MyProj/config/ >> /home/ubuntu/startup.log 2>amp;1 amp;
end script
  

Когда вам нужно запустить приложение в виртуальной среде python, вы можете либо «активировать» virtualenv, либо использовать уникальную python команду этой среды.

Согласно веб-сайту «Если вы напрямую запускаете скрипт или интерпретатор python из bin / каталога virtualenv (например, path/to/env /bin /pip или /path/to/env/bin/python script.py ) нет необходимости в активации.» —http://pypi.python.org/pypi/virtualenv

У меня также есть несколько модулей python, которые были скомпилированы из исходного кода. Они должны быть в переменной окружения PYTHONPATH. Это может быть частью вашей активации virtualenv, выполняемой с помощью virtualwrapper или вызываемой явно (как я делаю ниже).)

Вызов программы из задания UPSTART также работает. Мой пример приведен выше.

В экземпляре Ubuntu 10.10 на Amazon EC2 мне больше повезло с командой start-stop-daemon. Я также боролся с некоторыми другими «строфами» выскочки. Я вызываю приложение python с определенным virtualenv и некоторыми параметрами для моей выполняемой программы.

Комментарии:

1. Есть ли у вас какие-либо примеры скриптов (shell и / или python), которые работают с upstart? Вы упомянули «пример приведен ниже».