我计划为使用systemd. 我希望能够stop和start每个客户实例使用systemd,以及将整个客户实例集合视为可以一起停止和启动的单个服务。
systemd似乎提供了我需要使用的构建块PartOf和模板单元文件,但是我停止了父服务,子客户服务并未停止。如何使用 systemd 进行此操作?这是我到目前为止所拥有的。
父单元文件,app.service:
[Unit]
Description=App Web Service
[Service]
# Don't run as a deamon (because we've got nothing to do directly)
Type=oneshot
# Just print something, because ExecStart is required
ExecStart=/bin/echo "App Service exists only to collectively start and stop App instances"
# Keep running after Exit start finished, because we want the instances that depend on this to keep running
RemainAfterExit=yes
StandardOutput=journal
Run Code Online (Sandbox Code Playgroud)
一个名为 …
systemd附带的systemd-analyze命令具有verify允许您检查systemd单元文件语法的功能。
但是,当我今天使用systemdv238运行它时,我收到一条消息,提示已尝试删除磁盘文件系统。这是怎么回事?
$ sudo systemd-analyze verify /etc/systemd/system/my.timer
Attempted to remove disk file system, and we can't allow that
Run Code Online (Sandbox Code Playgroud) 我希望systemctl --user enable SERVICE在登录时启动该服务,但这并没有发生。那么它应该是什么意思呢?
我有一个登录到标准输出的 systemd 服务。从那里,systemd 捕获 STDOUT 并将其写入日志。
我使用一个常见的习惯用法来处理错误,在那里我进行了echo一些诊断,然后以非零错误代码退出:
echo "my final error";
exit 1;
Run Code Online (Sandbox Code Playgroud)
我的问题是这最后echo一行进入了日志,但与我的“单位”没有正确关联。通过查看journalctl -o json-pretty,我可以看到有什么不同。最后的日志记录缺少 _SYSTEMD_CGROUP 和 _SYSTEMD_UNIT 属性。
我认为正在发生的是一种竞争条件。我怀疑 bash 脚本journald在进入退出行之前没有等待完全处理。因此exit在journald完成处理日志条目之前到达该行。journald尝试查找unit发送日志的 ,但现在无法找到它,因为该单元不再运行。
如果我是对的,我可能可以通过sleep 1在我的exit 1声明之前放置来解决这个问题,但是有没有更好的方法来获得最终日志属性的属性?
我systemd在 Ubuntu 16.04 上使用版本 229。
Systemd 允许您创建模板单元,如systemd.unit中所述。
您可以在模板单元中使用许多变量。
我对......感兴趣"%j":
这是最后一个“-”和前缀名称末尾之间的字符串。
“前缀名称”也被定义:
对于实例化单元,这是指单元名称的第一个“@”字符之前的字符串。
我清楚它们是什么,但不清楚它们为什么存在。
我猜他们可能正在运行同一服务的多个版本。现实世界中如何使用它的示例是什么?