Systemd 到 ExecStart 总是执行?

Systemd 到 ExecStart 总是执行?

致力于创建 systemD 服务以从远程 SSH 服务器检索密钥文件,然后使用它在服务器(而不是根驱动器)上自动挂载加密的 Luks 磁盘。

[Unit]
Description=Open encrypted data volume
After=network-online.target
Wants=network-online.target
StopWhenUnneeded=true

[Service]
Type=oneshot
ExecStart=/bin/sh -c '/etc/luks/key.sh | /sbin/cryptsetup -d - -v luksOpen /dev/disk/by-uuid/13b051b5-7f4f-4030-92da-d59f12422f40 Data_Crypt'
RemainAfterExit=true
ExecStop=/sbin/cryptsetup -d - -v luksClose Data_Crypt

这似乎工作正常,但是每次我运行

systemctl start unlock-data.service

我检查了 systemd 日志,可以看到它既解锁了驱动器又锁定了它。 ExectStart 和 ExecStop 都正在触发。如果我完全删除其中的 ExecStop 行并再次运行“systemctl start”,它将完全按照预期解锁驱动器。

我也尝试将类型更改为“简单”,但这也不起作用。我相信 oneshot 对于我正在做的事情来说是正确的。

这是在 Debian 11.3 上。今天全新安装。

为什么每次启动时 ExecStop 都会触发?

答案1

该行为很可能是由于StopWhenUnneeded=true单位部分中的设置造成的。根据联机帮助页,不需要的定义是这样的:

StopWhenUnneeded=

采用布尔参数。如果为 true,则该单元将在不再使用时停止。请注意,为了最大限度地减少要执行的工作,systemd 默认情况下不会停止单元,除非它们与其他单元发生冲突,或者用户明确请求关闭它们。如果设置此选项,如果没有其他活动单元需要,单元将被自动清理。默认为 false。

由于没有其他单元依赖于这个自定义单元,systemd 一旦启动就会停止它。

相关内容