C / C ++中的systemd(新样式)守护程序

时间:2019-06-20 21:28:18

标签: daemon systemd

全部

Internet上有多个代码示例,这些示例说明了如何在纯C甚至C ++中编写旧样式的守护程序。

但是,“新样式”(或系统样式)没有这种东西。

是否可以使用基本的“简单守护程序”代码在C / C ++中编写“新样式” systemd守护程序?

TIA !!

1 个答案:

答案 0 :(得分:0)

我的Snap! C++ environment中有很多示例。在*.service目录下查找snapwebsites/debian文件,找到充当守护程序的项目。

或多或少,您编写了一个工具来打开端口以侦听和处理收到的消息。其余的由systemd负责。

以下是snapfirewall守护程序使用的示例:

# Documentation available at:
# https://www.freedesktop.org/software/systemd/man/systemd.service.html

[Unit]
Description=Snap! Websites snapfirewall daemon
After=snapbase.service snapcommunicator.service snapdbproxy.service
Before=fail2ban.service
[Service]
Type=simple
WorkingDirectory=~
ProtectHome=true
# snapfirewall needs to run iplock which setuid to root so we can't set
# this parameter to true
NoNewPrivileges=false
ExecStart=/usr/sbin/snapfirewall
ExecStop=/usr/bin/snapstop --service "$MAINPID"
Restart=on-failure
RestartSec=1min
User=snapwebsites
Group=snapwebsites
LimitNPROC=1000
# For developers and administrators to get console output
#StandardOutput=tty
#StandardError=tty
#TTYPath=/dev/console
# Enter a size to get a core dump in case of a crash
#LimitCORE=10G

[Install]
WantedBy=multi-user.target

# vim: syntax=dosini

如顶部所述,service unit documentation位于freedesktop上。

在这个例子中,我有一个NoNewPrivileges=false参数。这意味着suid将按预期工作。否则,我的工具无法向防火墙添加/删除规则,因为snapfirewall以snapwebsites用户身份运行,而根本无法运行iptables

这就是它的全部了。

注意::使用debian目录并构建自己的软件包的优点是,它将自动生成所有必要的脚本,以按预期方式启动/启用/停止服务。唯一的技巧是debian/rules必须包含--with systemd命令行选项。但除此之外,这将是一件轻而易举的事情。