类似,但不完全相同使用 systemd 在关机/重启时运行脚本:
我想在系统关闭(关机或重启,也可能崩溃)和系统启动时运行自定义进程systemd
。这两个操作都应尽早运行。
显然,服务的内容将Type
是,但我对其余的内容oneshot
不确定(Wants
,,,,等等)。Before
After
WantedBy
由于我的流程需要日志,因此我添加了(其中包括):
[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
。