我需要在该[install]
部分中添加什么内容,以便 systemd/home/me/so.pl
在关闭之前以及/proc/self/net/dev
被销毁之前运行?
[Unit]
Description=Log Traffic
[Service]
ExecStart=/home/me/so.pl
[Install]
?
答案1
建议的解决方案是将服务单元作为普通服务运行 - 请查看 参考资料 部分[Install]
。所以一切都必须逆向思考,依赖关系也是如此。因为关机顺序是启动顺序的逆过程。这就是为什么脚本必须放在ExecStop=
.
以下解决方案对我有用:
[Unit]
Description=...
[Service]
Type=oneshot
RemainAfterExit=true
ExecStop=<your script/program>
[Install]
WantedBy=multi-user.target
RemainAfterExit=true
当你没有ExecStart
行动时需要。
创建文件后,请确保systemctl daemon-reload
和systemctl enable yourservice --now
。
我刚刚从 systemd IRC 得到它,积分将归于 mezcalero。
答案2
运行服务就在开始之前任何重新启动/关闭/暂停/kexec 服务(即在根文件系统重新安装为只读之前的最后一刻)使用此服务配置:
[Unit] Description=Save system clock on shutdown DefaultDependencies=no After=final.target [Service] Type=oneshot ExecStart=/usr/lib/systemd/scripts/fake-hwclock.sh save [Install] WantedBy=final.target
启用它:
systemctl enable my_service.service
运行脚本就在实际之前restart/shutdown/halt/kexec(当您无法写入根文件系统时,因为它被重新挂载为只读)将此脚本可执行文件添加到目录中
/usr/lib/systemd/system-shutdown
。在执行实际系统halt/poweroff/reboot/kexec之前,systemd-shutdown将运行/usr/lib/systemd/system-shutdown/中的所有可执行文件,并向它们传递一个参数:“halt”、“poweroff”、“reboot” " 或 "kexec",具体取决于所选操作。该目录中的所有可执行文件都是并行执行的,并且在所有可执行文件完成之前不会继续执行操作。
另请参阅:
https://www.freedesktop.org/software/systemd/man/bootup.html
https://www.freedesktop.org/software/systemd/man/systemd-halt.service.html
答案3
我不完全确定,但我认为您不需要安装部分,尽管我明确添加了它。我也没有测试它,但我认为它应该可以帮助你开始:
[Unit]
Description=Log Traffic
Requires=network.target
After=network.target
Before=shutdown.target
DefaultDependencies=no
[Service]
ExecStart=/home/me/so.pl
Type=oneshot
RemainAfterExit=yes
[Install]
WantedBy=shutdown.target
答案4
据我所知,这满足了我的需要(但我不知道为什么)。
[Unit]
Description=Log Traffic
DefaultDependencies=no
Before=shutdown.target reboot.target halt.target
[Service]
ExecStart=/usr/local/bin/perl /home/me/log_traffic.pl --stop
Type=oneshot