如何使用 systemd 单元在启动(引导)和停止(关机、重启)时触发进程?

如何使用 systemd 单元在启动(引导)和停止(关机、重启)时触发进程?

类似,但不完全相同使用 systemd 在关机/重启时运行脚本

我想在系统关闭(关机或重启,也可能崩溃)和系统启动时运行自定义进程systemd。这两个操作都应尽早运行。

显然,服务的内容将Type是,但我对其余的内容oneshot不确定(Wants,,,,等等)。BeforeAfterWantedBy

由于我的流程需要日志,因此我添加了(其中包括):

[Unit]
DefaultDependencies=no
Wants=syslog.target
After=local-fs.target exit.target
Before=multi-user-target

[Service]
Type=oneshot
RemainAfterExit=no

[Install]
WantedBy=multi-user.target

启用服务后,我的程序会ExecStart=在挂载本地文件系统后启动(通过),但ExecStop=在创建临时文件之前会立即再次启动(通过)。重启后,它根本没有启动。

答案1

经过多次迭代,我发现这个解决方案涉及单元;一个用于启动,另一个用于关闭:

# /etc/systemd/system/log-start-test.service
[Unit]
Description=Test Start log entries
Documentation=man:logger(1)
Documentation=https://www.freedesktop.org/software/systemd/man/bootup.html
DefaultDependencies=no
After=local-fs.target
Before=sysinit.target
Requires=local-fs.target
ConditionPathExists=/usr/bin/logger

[Service]
Type=oneshot
TimeoutSec=5
ExecStart=/usr/bin/logger -p user.notice "Starting test..."

[Install]
WantedBy=sysinit.target

在本地文件系统被挂载后不久就会记录启动信息(根据要求)。

# /etc/systemd/system/log-stop-test.service
[Unit]
Description=Test Stop log entries
Documentation=man:logger(1)
Documentation=https://www.freedesktop.org/software/systemd/man/bootup.html
DefaultDependencies=no
After=default.target
Requires=local-fs.target
ConditionPathExists=/usr/bin/logger

[Service]
Type=oneshot
TimeoutSec=5
RemainAfterExit=yes
ExecStop=/usr/bin/logger -p user.notice "Stopping Test..."

[Install]
WantedBy=default.target

在前几个服务终止后(我猜是与它们同时运行)会记录停止消息。

存在TimeoutSec=5只是为了确保挂起的过程不会阻止启动或停止,并且很可能没有意义logger

相关内容