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


58

我需要在该[install]部分中添加什么,以便systemd /home/me/so.pl在关机之前以及/proc/self/net/dev销毁之前都可以运行?

[Unit]
Description=Log Traffic

[Service]
ExecStart=/home/me/so.pl

[Install]
?

Answers:


66

建议的解决方案是将服务单元作为普通服务运行-请参阅本[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

我只是从系统化的IRC那里获得的,信用将用于mezcalero。


6
在Ubuntu 16.04,您必须有一个ExecStart=/bin/true
niels

3
如果没有,则需要我对WHY的 假设,因为如果认为服务未运行,则不会尝试运行。使用户认为该服务正在运行,从而导致该服务在关闭时运行。RemainAfterExit=trueExecStartsystemdExecStopRemainAfterExit=truesystemdExecStop
费利佩·阿尔瓦雷斯

1
是否有任何方法可以确保该脚本在终止用户会话和用户进程之前运行并完成?
richmb

@richmb一点也不。来自文档Note that it is usually not sufficient to specify a command for this setting that only asks the service to terminate (for example, by queuing some form of termination signal for it), but does not wait for it to do so.
svenwltr

我已经尝试过此方法以及它的各种迭代方法,但是在Debian Stretch上不起作用。
2rs2ts

8

据我所见,这确实满足了我的需要(但我不知道为什么)。

[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

3
它由于两件事而起作用:1)DefaultDependencies = no使它忽略所有依赖关系,并在开始时“首先”运行,在停止时“最后”运行,始终遵循“ Before”和“ After”子句。2)它恰好在shutdown / reboot / halt目标上具有Before子句,因此它将恰好在停止时达到shutdown / reboot / halt之前运行(因为它们仅在停止时运行,它恰好可以执行您想要的操作)。
RDP

您可能需要添加kexec.target到Before位
hanetzer '16

这对我不起作用
Bug Killer

除非您也添加WantedBy=shutdown.target reboot.target halt.target到本[Unit]节中,否则我看不到它将如何工作。Before=After=不要更改依赖关系。
rsaw 2013年

1
@FelipeAlvarez:我删除了我的评论。
sid_com

7
  • 在启动任何重新启动/关闭/停止/ 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
    
  • 在实际的重新引导/关机/停止/ kexec 之前运行脚本(当您无法写入根文件系统时,因为它是只读安装的,则需要将该脚本可执行文件)添加到/usr/lib/systemd/system-shutdown目录中。

    在执行实际系统暂停/电源关闭/重新启动/ 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


1
我想在重启之后(在之前)执行尽可能近的操作final.target。理想情况下,我希望这是用户执行之后要执行的第一件事$ sudo reboot
Jaime Hablutzel

5

我不确定,但我不认为您需要安装部分,尽管我已明确添加了它。我也没有测试它,但我认为它应该可以帮助您入门:

[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

当我尝试此操作时,脚本将在启动(引导)后立即执行。
sid_com 2012年

@sid_com看完thread.gmane.org/gmane.comp.sysutils.systemd.devel/4515/...尝试添加DefaultDependencies =没有,也许去掉安装部分。否则,它可能有助于远程控制After / Requires行。
Ulrich Dangel,2012年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.