【问题标题】:Adding a python daemon to the systemd将 python 守护进程添加到 systemd
【发布时间】:2016-05-17 12:53:35
【问题描述】:

本质:

我创建了一个守护进程来管理远程平台上的一些任务。 它是用 python 编写的,并接受启动、停止和重新启动参数。 在尝试将其添加到 systemd 时(因此它将在系统启动时启动并在关机时停止等)我遇到了一个问题: 似乎看到守护进程正在运行,但我不确定它是否真的有效,因为重新启动或请求状态返回错误:

[user@centos ~]# systemctl restart mydaemon
Failed to restart mydaemon.service: Unit mydaemon.service failed to load: No such file or directory.

[user@centos ~]# systemctl status mydaemon
● mydaemon.service
   Loaded: not-found (Reason: No such file or directory)
   Active: inactive (dead)

具体情况:

代码本身遵循 Sander Marechal 著名的 example,几乎没有更改。它本身没有任何问题,并对所有接受的论点做出适当的反应。 pid 保存在/tmp/my-daemon.pid

systemd服务文件在用户daemons目录:/usr/lib/systemd/user/mydaemon.service,代码如下:

[Unit]
Description=The user daemon

[Service]
Type=forking
ExecStart=/usr/bin/python /home/frcr/mydaemon_v01.py start
ExecStop=/usr/bin/python /home/frcr/mydaemon_v01.py stop
RestartSec=5
TimeoutSec=60
RuntimeMaxSec=infinity
Restart=always
PIDFile=/tmp/my-daemon.pid


[Install]
WantedBy=multi-user.target

systemctl 将其状态返回为活动状态,但前提是提供了 pid:

[user@centos ~]# systemctl status 9177
● session-481.scope - Session 481 of user user
   Loaded: loaded
  Drop-In: /run/systemd/system/session-481.scope.d
           └─50-After-systemd-logind\x2eservice.conf, 50-After-systemd-user-sessions\x2eservice.conf, 50-Description.conf, 50-SendSIGHUP.conf, 50-Slice.conf
   Active: active (running) since Tue 2016-05-17 06:24:51 EDT; 1h 43min ago
   CGroup: /user.slice/user-0.slice/session-481.scope
           ├─8815 sshd: root@pts/0
           ├─8817 -bash
           ├─9177 python /home/user/mydaemon_v01.py start
           └─9357 systemctl status 9177

我在此处看到堆栈溢出的similar question,但它似乎无法解决我的问题。

我认为由于完全缺乏 systemd 经验,我遗漏了一些非常明显的东西,如果有人能为我指出这一点或告诉我正确的移动方向,我将非常感激。提前谢谢,请原谅我疯狂的英语技能。

【问题讨论】:

    标签: python linux daemon centos7 systemd


    【解决方案1】:

    使用完整路径名启用守护程序可以解决该问题,但有更好的解决方案。

    问题是该服务位于 user 目录中,但作为 system 服务启动。但是 /usr/lib 无论如何都不是添加新 service 文件的正确位置。该目录用于存放作为操作系统包的一部分提供的文件。添加新system服务的正确目录在/etc/systemd/systemrelated docs about systemd paths

    您仍然希望enable 服务以确保它在启动时被加载。

    【讨论】:

    • 谢谢,这真的很有帮助。下次我会尝试更加关注文档。
    【解决方案2】:

    经过一些额外的谷歌搜索后,我找到了一个解决方案:我实际上忘记将守护进程添加到systemctl

    [root@centos ~]# systemctl enable /usr/lib/systemd/user/mydaemon.service
    Created symlink from /etc/systemd/system/multi-user.target.wants/mydaemon.service to /usr/lib/systemd/user/mydaemon.service.
    Created symlink from /etc/systemd/system/mydaemon.service to /usr/lib/systemd/user/mydaemon.service.
    

    另外值得一提的是绝对路径是必须的。

    剩下的就是刷新systemctl:

    [root@centos ~]# systemctl daemon-reload
    

    然后添加服务,然后

    [root@centos ~]# systemctl start mydaemon
    [root@centos ~]# systemctl restart mydaemon
    [root@centos ~]# systemctl stop mydaemon
    

    一切正常。

    【讨论】:

      猜你喜欢
      • 2012-10-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-05-27
      • 1970-01-01
      • 1970-01-01
      • 2016-08-21
      相关资源
      最近更新 更多