2013-08-09 2 views
2

У меня есть приложение python с циклом, которое генерирует некоторые файлы, сохраняет видеоизображения и некоторые другие вещи. я установил его на ПК Fedora (17) и хочу, чтобы он запускался «навсегда», то есть, если он зависает (я могу поместить некоторый файл keep_alive в файл в цикле) - его следует перезапустить. Он также должен быть запущен при перезагрузке. Как я понимаю, python-daemon помогает сделать это и systemd в Fedora. У меня есть следующий конфигурационный файл для Systemd (им не уверен, что по некоторым параметрам, хотя, как документация слишком сложна для моего уровня знаний Linux):python app (daemon) и systemd fedora

[Unit] 
Description=TPR Daemon 

[Service] 
Type=forking 
Restart=always 
WorkingDirectory=/home/igor/tpr 
PIDFile=/var/run/tpr.pid 
ExecStart=/usr/bin/python /home/igor/tpr/testd.py 

[Install] 
WantedBy=default.target 

и вот мой testd.py:

import daemon 
import time, sys 

class MyDaemon(object): 
    def __init__(self): 
     pass 

    def run(self): 
     while True: 
      print 'I am alive!' 
      time.sleep(1) 

if __name__ == '__main__': 
    with daemon.DaemonContext(stdout=sys.stdout): 
     check = MyDaemon() 
     check.run() 

, когда я запустить его с «Судо systemctl начать tpr.service», он висит на некоторое время, а затем сокращается с этим meesage:

Предупреждение: блок файла tpr.service изменен на диске, «systemctl --system daemon-reload 'рекомендуется. Работа для tpr.service не удалась. Подробнее см. «Systemctl status tpr.service» и «journalctl -xn».

и вот некоторые журналы из/вар/Журнал/сообщений:

Aug 9 21:32:27 localhost systemd[1]: Unit tpr.service entered failed state. 
Aug 9 21:32:27 localhost systemd[1]: tpr.service holdoff time over, scheduling restart. 
Aug 9 21:32:27 localhost systemd[1]: Stopping TPR Daemon... 
Aug 9 21:32:27 localhost systemd[1]: Starting TPR Daemon... 
Aug 9 21:33:57 localhost systemd[1]: tpr.service operation timed out. Terminating. 
Aug 9 21:33:57 localhost python[28702]: I am alive! 
Aug 9 21:33:57 localhost python[28702]: I am alive! 
Aug 9 21:33:57 localhost python[28702]: I am alive! 
Aug 9 21:33:57 localhost python[28702]: I am alive! 
... 
Aug 9 21:33:57 localhost python[28702]: I am alive! 
Aug 9 21:33:57 localhost python[28702]: I am alive! 
Aug 9 21:33:57 localhost python[28702]: I am alive! 
Aug 9 21:33:57 localhost python[28702]: I am alive! 
Aug 9 21:33:57 localhost systemd[1]: tpr.service: control process exited, code=exited status=1 
Aug 9 21:33:57 localhost systemd[1]: Failed to start TPR Daemon. 
Aug 9 21:33:57 localhost systemd[1]: Unit tpr.service entered failed state. 
Aug 9 21:33:57 localhost systemd[1]: tpr.service holdoff time over, scheduling restart. 
Aug 9 21:33:57 localhost systemd[1]: Stopping TPR Daemon... 
Aug 9 21:33:57 localhost systemd[1]: Starting TPR Daemon... 

поэтому он должен быть запущен, но то, что эта ошибка о? И, может быть, есть простой удобный способ выполнить мою задачу, и я изобретаю велосипед?

Update:

Кажется, демон должен каким-то образом позволить Systemd знать это started..but как?

Aug 10 01:15:36 localhost systemd[1]: Starting TPR Daemon... 
Aug 10 01:17:06 localhost systemd[1]: tpr.service operation timed out. Terminating. 
Aug 10 01:17:06 localhost systemd[1]: tpr.service: control process exited, code=exited status=1 
Aug 10 01:17:06 localhost systemd[1]: Failed to start TPR Daemon. 
Aug 10 01:17:06 localhost systemd[1]: Unit tpr.service entered failed state. 
Aug 10 01:17:06 localhost systemd[1]: tpr.service holdoff time over, scheduling restart. 
Aug 10 01:17:06 localhost systemd[1]: Stopping TPR Daemon... 
Aug 10 01:17:06 localhost systemd[1]: Starting TPR Daemon... 
Aug 10 01:18:36 localhost systemd[1]: tpr.service operation timed out. Terminating. 
Aug 10 01:18:36 localhost systemd[1]: tpr.service: control process exited, code=exited status=1 
Aug 10 01:18:36 localhost systemd[1]: Failed to start TPR Daemon. 
Aug 10 01:18:36 localhost systemd[1]: Unit tpr.service entered failed state. 
Aug 10 01:18:36 localhost systemd[1]: tpr.service holdoff time over, scheduling restart. 
Aug 10 01:18:36 localhost systemd[1]: Stopping TPR Daemon... 
Aug 10 01:18:36 localhost systemd[1]: Starting TPR Daemon... 

ответ

3

Ошибка при изменении на диске означает, что файл изменен. После запуска systemctl daemon-reload файл будет перечитан, и вы сможете запустить сервис. Вы можете использовать оповещения, как указано в this manual pages. Тип услуги: notify. Следующая вещь: вы говорите, что ваш тип обслуживания как forking. Действительно ли ваш процесс развивается? Рекомендуется использовать опцию PIDfile, если вы используете forking. С systemd не нужно разветвлять ваш процесс, чтобы стать демоном.

+0

исправленная ошибка перезагрузки, спасибо. мой процесс не развивает, я пока не могу понять, что это значит, задайте тип как рекомендуется. Как я понимаю, forking похож на дочерний или подпроцесс, но у меня есть только цикл внутри моего скрипта. поэтому какой тип установить в моем случае? если я установил тип для «уведомления», это не сработает: 11 августа 10:34:08 localhost systemd [1]: Запуск TPR Daemon ... 11 августа 10:35:38 localhost systemd [1]: tpr. срок службы службы истекает. Нагрузочный. Aug 11 10:35:38 localhost systemd [1]: Не удалось запустить TPR Daemon. 11 авг 10:35:38 localhost systemd [1]: Узел tpr.service введен в состояние сбой. – loknar

+0

Да. В системе sysv init процесс должен сам разворачиваться, чтобы стать демонами. С systemd он не нужен. Я почти не понимаю, как systemd работает в процессе демонализации (я должен сделать более всеобъемлющий взгляд на его источники). Несомненно, это таймаут, потому что вы не отправляете уведомление 'systemd' с' sd_notify': http://www.freedesktop.org/software/systemd/man/sd_notify.html Если вы не используете уведомления, вы можете установить 'Type = simple'. –

+0

И еще одно: что делает эта строка 'import daemon'? –