在我的 Archlinux 系统上,该/usr/lib/systemd/system/mdmonitor.service
文件包含以下几 行:
[Service]
Environment= MDADM_MONITOR_ARGS=--scan
EnvironmentFile=-/run/sysconfig/mdadm
ExecStartPre=-/usr/lib/systemd/scripts/mdadm_env.sh
ExecStart=/sbin/mdadm --monitor $MDADM_MONITOR_ARGS
Run Code Online (Sandbox Code Playgroud)
我怀疑(通过一些谷歌搜索确认)这=-
意味着如果指定的文件不存在,服务不应该失败。但是我没有在 systemd 单元文件的联机帮助页中找到这种行为。=-
任务的官方文件在哪里?
一些应用程序,如 ssh,有一个以 @ 结尾的单元文件,比如ssh.service
和ssh@.service
。它们包含不同的内容,但我无法理解功能或目的究竟有何不同。
这是我不知道的一些命名约定吗?
# systemd-timesyncd.service
...
Before=time-sync.target sysinit.target shutdown.target
Conflicts=shutdown.target
Wants=time-sync.target
Run Code Online (Sandbox Code Playgroud)
systemd-timesyncd.service
应该开始之前 time-sync.target
。这定义了一个排序依赖。
但同时systemd-timesyncd.service
要 time-sync.target
。那么time-sync.target
它的需求依赖是什么
这种关系的用例是什么,为什么它们彼此之间没有冲突?
我有一个关于为 Systemd 制作我自己的单元(服务)文件的问题。
我已经阅读了文档并有一些问题。四处搜索后,我发现了这个非常有用的答案,其中提供了有关我遇到的一些问题的一些详细信息。
如何编写运行 systemd-tmpfiles 的 systemd .service 文件
虽然我觉得这个答案很有用,但仍有一部分我不明白。主要是这部分:
由于我们实际上希望此服务运行得更晚而不是更早,因此我们指定了一个“After”子句。这实际上不需要与 WantedBy 目标相同(通常不是)
我对 After 的理解是它非常简单。该服务(或您定义的任何服务)将在 After 中列出的单元之后运行。
同样,WantedBy 看起来很简单。您正在定义您列出的单位对您的服务有需求。因此,对于像多用户或图形这样的目标,应该运行您的单元,以便 systemd 考虑达到该目标。
现在,假设我对这些声明如何工作的理解到目前为止是正确的,我的问题是:为什么在 After 和 WantedBy 子句中列出相同的单元会起作用?
例如,定义一个在 multi-user.target 和 WantedBy multi-user.target 之后的单元在我看来会导致不可能的情况,即在达到目标后需要启动该单元,但它也需要开始被视为“达到”的目标。
我误解了什么吗?
操作系统:Ubuntu 20.04.3
$ \cat /home/nikhil/.config/systemd/user/Festival.service
[Unit]
Description=Festival Service
[Service]
ExecStart=/usr/bin/festival --server
Restart=on-failure
RestartSec=10
SyslogIdentifier=FestivalService
[Install]
WantedBy=multi-user.target
Run Code Online (Sandbox Code Playgroud)
我这样做了systemctl --user enable Festival.service
,重新启动了我的系统。但节日服务器没有启动。只有当我手动执行时systemctl --user start Festival.service
,它才会启动。
您能否告诉我,为什么用户服务不能与 一起使用multi-user.target
,而它应该在每次启动时都起作用?
我正在尝试将守望者设置为用户服务。
我已经尽可能地密切关注他们的文档。这就是我所拥有的:
套接字文件:
[Unit]
Description=Watchman socket for user %i
[Socket]
ListenStream=/usr/local/var/run/watchman/%i-state/sock
Accept=false
SocketMode=0664
SocketUser=%i
SocketGroup=%i
[Install]
WantedBy=sockets.target
Run Code Online (Sandbox Code Playgroud)
服务文件:
[Unit]
Description=Watchman for user %i
After=remote-fs.target
Conflicts=shutdown.target
[Service]
ExecStart=/usr/local/bin/watchman --foreground --inetd --log-level=2
ExecStop=/usr/bin/pkill -u %i -x watchman
Restart=on-failure
User=%i
Group=%i
StandardInput=socket
StandardOutput=syslog
SyslogIdentifier=watchman-%i
[Install]
WantedBy=multi-user.target
Run Code Online (Sandbox Code Playgroud)
Systemd 尝试运行 watchman,但卡在重启循环中。
这些是我得到的错误:
Apr 16 05:41:00 debian systemd[20894]: watchman@user.service: Failed to determine supplementary groups: Operation not permitted
Apr 16 05:41:00 debian systemd[20894]: watchman@user.service: Failed at step GROUP spawning /usr/local/bin/watchman: Operation not permitted
Run Code Online (Sandbox Code Playgroud)
我 100% …
据我从systemd的文档中可以看出,Wants=
并WantedBy=
执行相同的功能,除了前者放在依赖单元文件中,反之亦然。(那个,并WantedBy=
创建unit.type.wants
目录并用符号链接填充它。)
该
WantedBy=
指令...允许您以与Wants=
该[Unit]
部分中的指令类似的方式指定依赖关系。不同之处在于该指令包含在辅助单元中,允许列出的主要单元保持相对清洁。
它真的只是保持单元文件“干净”吗?使用这两个指令的最佳实践是什么?也就是说,如果服务阿尔法“想”的服务测试版,我什么时候应该用Wants=beta.service
在alpha.service
和什么时候应该更喜欢WantedBy=alpha.service
在beta.service
?
我有一个由大约 15 个服务组成的系统。它们没有相互依赖性(即没有服务需要另一个服务来启动),并且它们在启动完成时通知 systemd(即Type=notify
)。
问题是,如果我同时启动它们,我的系统就会过载,并且进程会由于 systemd 超时而被终止。
我想要做的是将我的服务“分组”,以便它们一个接一个地启动,没有特定的顺序。这可以通过 systemd 服务文件实现吗?
顺便说一句:这是我的服务文件的模板:
[Unit]
Description=Template service file
After=network.target
[Service]
Type=notify
User=1000
Group=1000
# Set the working directory and the binary to start
WorkingDirectory=/home/user/
ExecStart=/path/to/some/process
# The standard input and output are useless (i.e. unused by the process)
StandardInput=null
StandardOutput=null
# Disable the standard error because all logs are already saved in a specific directory
StandardError=null
# Send SIGTERM then SIGKILL after TimeoutStopSec seconds (default: 2)
KillMode=mixed
TimeoutStopSec=2
# Setup a …
Run Code Online (Sandbox Code Playgroud) 鉴于 CLI 工具systemctl edit
可用于编辑现有的 systemd 单元,例如服务、计时器、套接字、设备、挂载、自动挂载、目标、交换、路径、切片、范围或 nspawn 文件,并且您还有另一个可以删除/重置 systemd 单元的子命令我也可以像这样创建一个新的 systemctl 文件吗?
大多数在线指南都会告诉您使用一些自定义文本编辑器并将文件放置在某个位置(您首先需要找到正确的 systemd 目录,再次\xe2\x80\xa6)。\n此外,如果您复制,则需要重新加载守护进程手动通过文件systemctl daemon-reload
。
然而,作为系统管理员,我可能会在默认位置快速创建一个新单元,就像systemctl edit
编辑/覆盖现有条目一样。\n我只是喜欢它如何将我直接弹出到我最喜欢的 CLI 文本编辑器(nano 左右)中,并且我可以立即编辑我的内容。
我尝试systemctl add
过并且systemctl create
,但这两个命令都不存在。
我在网上没有找到该信息,也没有在此处找到任何 Stackexchange 答案\xe2\x80\xa6
\n我有一个 vpn 服务单元,我可以使用它查看日志...
journalctl -u vpn
Run Code Online (Sandbox Code Playgroud)
我还有一个脚本可以手动与 vpn 交互,并使用...
exec > >(systemd-cat -t vpn.sh) 2>&1
Run Code Online (Sandbox Code Playgroud)
我可以查看日志...
journalctl -t vpn.sh
Run Code Online (Sandbox Code Playgroud)
我尝试使用...查看两个日志
journalctl -u vpn -t vpn.sh
Run Code Online (Sandbox Code Playgroud)
但它没有用。
有没有办法同时查看两个日志?或者是否可以-t vpn.sh
在 vpn 服务单元文件中设置标识符 ( ) 以匹配我的脚本 ( vpn.sh
)的标识符。
systemd-unit ×10
systemd ×9
services ×4
boot ×1
dependencies ×1
linux ×1
systemctl ×1
ubuntu ×1