如何在关机前使用 systemd 运行脚本?

如何在关机前使用 systemd 运行脚本?

我需要在该[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-reloadsystemctl 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”、“rebo​​ot” " 或 "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

相关内容