编写基本的 systemd 服务文件

bea*_*mit 116 systemd services

我正在开发一个 Nodejs 应用程序,用户通过 localhost 上的 HTTP 与之交互。几乎没有参数,守护进程几乎没有依赖关系,它只需要在登录时启动。

我想按照每个平台上的习惯用法来启动脚本,这意味着 Ubuntu 上的 Upstart 和 Fedora 上的 systemd。

  • 有没有写systemd系统文件的好教程?
  • 是否有任何“最佳实践”需要注意?

我找到了这些资源:

我主要是在寻找各种 API 作为参考,以及要遵循的基本格式。

nec*_*cer 192

以下示例受此链接的启发,该链接实际上并未提及所有步骤,仅列出来源:http : //patrakov.blogspot.com/2011/01/writing-systemd-service-files.html

第 1 步:我创建了这个文件(注意位置),它本质上是用一个扩展参数触发一个 bash 进程。您可以触发自己的命令,该命令可能与 bash 不同。

[root@y500-fedora ~]# cat /etc/systemd/system/foo.service 
[Unit]
Description=foo

[Service]
ExecStart=/bin/bash -c "while true; do /bin/inotifywait -qq --event close_write /sys/class/backlight/acpi_video0/brightness; su myusername -c '/bin/xbacklight -display :0 -set $(cat /sys/class/backlight/acpi_video0/brightness)'; done"

[Install]
WantedBy=multi-user.target
Run Code Online (Sandbox Code Playgroud)

第 2 步

重新加载systemd

systemctl daemon-reload
Run Code Online (Sandbox Code Playgroud)

启动新服务:

systemctl enable foo
Run Code Online (Sandbox Code Playgroud)

(同样你可以disable

(可选)第 3 步:它应该在下次重新启动到多用户模式(运行级别 3)时自动启动,但如果您想立即启动它:

systemctl start foo
systemctl status foo # optional, just to verify
Run Code Online (Sandbox Code Playgroud)

更新:为了完整起见,我应该补充一点,ubuntu 仿生似乎有一个非常详尽的手册页。RTFM在这里

  • systemctl 有一个 cat 命令快捷方式,供参考。 (2认同)
  • 根据 systemd.unit 手册页,你应该把它放在 `/etc/systemd/system` 中。/usr/lib/systemd 是适当的分发包放置文件的地方。 (2认同)

jas*_*yan 26

我将从Systemd 手册页开始。它们代表了系统和服务的综合资源。

还有freedesktop Systemd FAQs

  • 谁有时间在那里生活开始。我的意思是,如果你知道你在做什么,那是一个很好的参考,但天哪,手册页很复杂。 (57认同)
  • 手册页会很有用(虽然我希望它更干净),但是有基本的系统文件教程吗?比如哪些部分是必须的,哪些部分是推荐的,哪些部分是可选的。手册页似乎假设我已经是 systemd 系统文件方面的专家,而我不是。 (47认同)

car*_*cal 6

Redhat 文档是一个很好的来源。

  • 虽然这在理论上可以回答这个问题,但在这里[最好包括答案的基本部分](http://meta.stackoverflow.com/q/8259),并提供链接以供参考。 (2认同)