#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
, если страница руководства существует, она должна содержать указания на то, как это сделать. Также попробуйте поискать в Googlestartup 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? Вы упомянули «пример приведен ниже».