我正在尝试设置一个 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
我只是想将我的解决方案记录下来以备将来使用。
欢迎提出意见和建议!