
У меня есть программа на C, которую я хочу запустить как демон. Я работаю в Ubuntu 14.04LTS. Как правильно это сделать? Может кто-нибудь помочь?
решение1
А теперь ответ Ubuntu.
Правильный способ сделать это — использовать менеджер демонов, который поставляется с Ubuntu 14. То, что здесь говорили другие о разработке программы явно как демона и вызове daemon()
библиотечной функции, совершенно неверно. По иронии судьбы, Ubuntu имел upstart для трех релизов LTSпрежнийдо версии 14 LTS — с Ubuntu 6.10 в 2006 году на самом деле. С тех пор у него был менеджер демонов, того или иного рода.
Правильным ответом для людей с надлежащим управлением услугами было бы то, что вынепозвоните daemon()
и вынепредпринять специальные шаги, чтобы «стать демоном». И для некоторых людей это был правильный ответ с начала 1990-х. Даже 2006 год немного опоздал на вечеринку. ☺ Тем не менее, это определенно был правильный ответ на протяжении последних десяти лет, когда дело касалось Ubuntu.
То, что вы делаете, просто. Вы настраиваете файл "job" upstart, который сообщает upstart, когда и как вызывать вашу программу. upstart вызывает ееуже демонизирован, без управляющего терминала и с предсказуемым и неизменным начальным состоянием процесса. Ваша программаничего особенного не делаети просто запускается, записывая логи и сообщения об ошибках в стандартную ошибку обычным способом. Вы организуете в файле задания, как upstart обрабатывает то, что записывается в стандартную ошибку.
Theкулинарная книга upstartПодробно описывает все это, включая различные строфы, контролирующие события запуска и обработку журнала. И есть много информации по этой теме здесь и на AskUbuntu.
Будьте готовы к тому, что мир для вас изменится довольно существенно, если вы позже обновитесь до Ubuntu 16 LTS. Но даже тогданичего особенного не делать в коде и просто запустить под управлением демон-менеджераостанется правильным ответом.
дальнейшее чтение
- Джеймс Хант и Клинт Байрум (2014). "Консоль". Кулинарная книга Upstart.
- https://unix.stackexchange.com/a/200281/5132
- в этомСтраницы руководства Ubuntu 14.04. Канонические.
- Джонатан де Бойн Поллард (2001). Ошибки, которых следует избегать при разработке программ-демонов Unix. Часто задаваемые ответы.
- https://superuser.com/a/723333/38062
- https://askubuntu.com/a/613814/43344
решение2
Если вам нужно запустить программу из терминала, вот несколько способов (ваша программа не должна запрашивать никакого ввода данных пользователем):
Используя
nohup
:nohup program > program.log 2>program.err &
. Затем вы можете выйти из терминала.Используя
atd
услугу:echo "program > program.log 2>program.err" | at now
илиecho "program > program.log 2>program.err" | batch
.как служба с помощью загрузочного скрипта.
Если ваша программа запрашивает ввод данных пользователем, то ее невозможно будет запустить вне терминала. Лучше всего использовать сеанс screen
или tux
, а затем отсоединить его от терминала.