systemd 服务在启动和关闭时需要网络访问 Linux Mint 19.1

systemd 服务在启动和关闭时需要网络访问 Linux Mint 19.1

我正在尝试设置一个 systemd 服务,该服务在系统完全启动(需要互联网访问)后执行一个脚本,并且在系统关闭或重启(需要互联网访问)之前执行不同的脚本。

我昨天花了一整天时间阅读了数十个论坛帖子和指南,但无法理解其中的逻辑。到目前为止,我得到了:

[Unit]
Description=Execute custom script on shutdown
After=network.target

[Service]
Type=oneshot
ExecStart=/etc/init.d/hostup
ExecStop=/etc/init.d/hostdown

[Install]
WantedBy=halt.target reboot.target shutdown.target

我的想法是:该设备在启动时等待网络目标,因为它需要执行该任务After=network.target

在服务启动时,它会执行第一个脚本ExecStart=/etc/init.d/hostup

最后在关机或重启时执行第二个脚本ExecStop=/etc/init.d/hostdown

这是否接近还是我需要有两个单独的服务,每个服务处理一个脚本?

另外,哪里是放置这些脚本的适当位置?/etc/init.d/这只是一个想法。

任何意见表示赞赏

编辑:

我投入了更多时间,现在我必须分离服务:

对于启动:

Description=Custom Command on startup
After=network-online.target

[Service]
Type=idle
ExecStart=/etc/init.d/hostup

[Install]
WantedBy=network-online.target

并关闭:

[Unit]
Description=Execute custom script on shutdown
Before=shutdown.target network.target

[Service]
ExecStart=/bin/true
ExecStop=/etc/init.d/hostdown
RemainAfterExit=yes

[Install]
WantedBy=halt.target reboot.target shutdown.target

我当前的问题是定义运行级别。

当我运行时sudo systemctl enable hostup.service弹出以下错误:

Synchronizing state of hostup.service with SysV service script with /lib/systemd/systemd-sysv-install.
Executing: /lib/systemd/systemd-sysv-install enable hostup
update-rc.d: error: hostup Default-Start contains no runlevels, aborting.

如能得到关于如何正确定义运行级别的任何帮助,我们将不胜感激。

答案1

找到了适合我的解决方案。

关机时运行的服务:

[Unit]
Description=Execute custom script on shutdown
Before=network-online.target

[Service]
ExecStart=/bin/true
ExecStop=/usr/local/bin/hostdown.sh
RemainAfterExit=yes

[Install]
WantedBy=halt.target reboot.target shutdown.target poweroff.target

启动时运行的服务:

[Unit]
Description=Custom Command on startup
After=network-online.target
After=network.target
After=systemd-user-sessions.service

[Service]
Type=oneshot
RemainAfterExit=yes
ExecStartPre=/bin/sleep 30
ExecStart=/usr/local/bin/hostup.sh
RestartSec=5

[Install]
WantedBy=multi-user.target

后者可能不是最聪明或最漂亮的解决方案,我还是不太明白为什么没有这行代码就行不通 ExecStartPre=/bin/sleep 30

我只是想将我的解决方案记录下来以备将来使用。

欢迎提出意见和建议!

相关内容