当前位置: 首页 > 面试题库 >

Python守护程序和systemd服务

公良信然
2023-03-14
问题内容

我有一个简单的Python脚本充当守护程序。我试图创建systemd脚本,以便能够在启动过程中启动此脚本。

当前的systemd脚本:

[Unit]
Description=Text
After=syslog.target

[Service]
Type=forking
User=node
Group=node
WorkingDirectory=/home/node/Node/
PIDFile=/var/run/zebra.pid
ExecStart=/home/node/Node/node.py

[Install]
WantedBy=multi-user.target

node.py:

if __name__ == '__main__':
    with daemon.DaemonContext():
        check = Node()
        check.run()

run包含while True循环。

我尝试使用运行该服务systemctl start zebra-node.service。不幸的是,服务从未完成说明序列-我必须按Ctrl + C。脚本正在运行,但是状态为激活,一段时间后变为停用状态。现在我正在使用python-daemon(但是在我尝试不使用它之前,症状是相似的)。

我应该为脚本实现一些其他功能还是systemd文件不正确?


问题答案:

原因是,它没有完成启动顺序,是因为对于Type,forking您的启动过程需要分叉并退出(请参阅$ man systemd.service-搜索分叉)。

只需使用主过程,不守护
一种选择是减少工作量。使用systemd时,通常无需创建守护程序,您可以直接运行代码而不进行守护程序。

#!/usr/bin/python -u
from somewhere import Node
check = Node()
check.run()

这允许使用称为的更简单的服务类型simple,因此您的单位文件将看起来像。

[Unit]
Description=Simplified simple zebra service
After=syslog.target

[Service]
Type=simple
User=node
Group=node
WorkingDirectory=/home/node/Node/
ExecStart=/home/node/Node/node.py
StandardOutput=syslog
StandardError=syslog

[Install]
WantedBy=multi-user.target

请注意,-u不需要使用in python shebang,但是如果您将某些内容输出到stdout或stderr,请-u确保没有适当的输出缓冲,并且系统会立即捕获打印的行并将其记录在日志中。没有它,它会出现一些延迟。

为此,我将行StandardOutput=syslog添加到了单元文件中StandardError=syslog。如果您不关心日记本中的打印输出,则不必关心这些行(不必存在)。

systemd 使守护进程过时

虽然您的问题的标题明确询问了有关守护程序的问题,但我想,问题的核心是“如何使我的服务运行”,而使用主进程似乎要简单得多(您根本不必关心守护程序),可以被视为您问题的答案。

我认为,许多人之所以使用守护进程,只是因为“每个人都这样做”。使用systemd时,守护进程的原因通常已过时。使用守护程序可能有一些原因,但是现在很少见。

编辑:固定python -p为正确python -u



 类似资料:
  • 我有一个简单的Python脚本作为守护程序工作。我正在尝试创建systemd脚本,以便能够在启动期间启动此脚本。 当前systemd脚本: node.py: < code>run包含< code>while True循环。 我尝试使用< code > system CTL start zebra-node . service 运行此服务。不幸的是,服务从来没有完成状态序列-我必须按下Ctrl C。

  • 问题内容: 我正在做Java试卷,并且遇到了以下使我感到困惑的问题。 以下哪项是正确的?(选择所有适用项。) 答:当应用程序开始运行时,会有一个守护线程,其任务是执行main()。 B.当一个应用程序开始运行时,有一个非守护进程线程,其工作是执行main()。 C.由守护程序线程创建的线程最初也是守护程序线程。 D.由非守护程序线程创建的线程最初也是非守护程序线程。 关键答案是B,C,D,谁能告诉

  • 本文向大家介绍python实现守护进程、守护线程、守护非守护并行,包括了python实现守护进程、守护线程、守护非守护并行的使用技巧和注意事项,需要的朋友参考一下 守护进程 1、守护子进程 主进程创建守护进程 其一:守护进程会在主进程代码执行结束后就终止 其二:守护进程内无法再开启子进程,否则抛出异常:AssertionError: daemonic processes are not allow

  • 问题内容: 哈o 我试图让python脚本在(ubuntu)linux上作为服务(守护程序)运行。 在网络上,存在几种解决方案,例如: http://pypi.python.org/pypi/python- daemon/ 行为规范的Unix守护进程很难正确执行,但是每个守护程序所需的步骤几乎相同。DaemonContext实例保存程序的行为和配置的进程环境。使用实例作为上下文管理器进入守护程序状

  • 问题内容: 我有一个查询,就是我在多个线程下面开发了一个代码,这些线程分别称为线程一和线程二,下面是代码.. 类multip实现Runnable { 现在,我希望将线程2设置为守护程序线程,它应该为线程1提供某种服务,它可以是任何类型的服务,但最后我试图实现的是,守护程序线程向非守护程序线程提供某种服务。请告知如何实现。问题是有关守护程序线程将如何向非守护程序线程提供服务的问题。 问题答案: 问题

  • 问题内容: Docker的默认DNS(例如8.8.8.8)在我工作的地方被阻止,因此我想更改默认值。我已经能够使用 但是我想使用systemd插件代替它,因为官方Docker文档推荐这种方式。我已经制作了一个文件,并使用了以下内容: 但是我只是不知道变量名应该是什么。我该如何设置?更重要的是,是否有一个页面记录了可在Docker的systemd插件中使用的所有配置变量? (顺便说一句,这是Ubun