У меня есть приложение 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...
исправленная ошибка перезагрузки, спасибо. мой процесс не развивает, я пока не могу понять, что это значит, задайте тип как рекомендуется. Как я понимаю, 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
Да. В системе sysv init процесс должен сам разворачиваться, чтобы стать демонами. С systemd он не нужен. Я почти не понимаю, как systemd работает в процессе демонализации (я должен сделать более всеобъемлющий взгляд на его источники). Несомненно, это таймаут, потому что вы не отправляете уведомление 'systemd' с' sd_notify': http://www.freedesktop.org/software/systemd/man/sd_notify.html Если вы не используете уведомления, вы можете установить 'Type = simple'. –
И еще одно: что делает эта строка 'import daemon'? –