Ubuntu 20.04 – 关机/重启时运行脚本

Ubuntu 20.04 – 关机/重启时运行脚本

我试图在关机和重启时运行一个脚本,但没有成功。我有一个在启动时以 root 身份运行的脚本,它运行良好:将脚本存储在 /etc/init.d 中,在 /etc/rc2.d 中创建以 S99 开头的链接,并使其可执行。经过一番研究,我对关机脚本做了同样的事情,在 /etc/rc0.d 和 /etc/rc6.d 中创建链接,使其可执行,并以“K99myscript”开头链接名称,但脚本没有运行。我尝试将链接名称更改为“K00myscript”以在其他链接之前运行,将 sh 更改为 bash(#! /bin/sh 更改为 #! /bin/bash),但似乎没有任何帮助。我正在运行 Xubunto 并使用“systemctl poweroff”关机和“systemctl reboot”重启。这是一种过时的方法吗?

我还尝试按照建议在 /etc/systemd/system 中创建一个 .service:

[Unit]
Description=Pre-Shutdown Processes
DefaultDependencies=no
Before=shutdown.target reboot.target halt.target kexec.target

[Service]
Type=oneshot
User=root
Group=root
ExecStart=/etc/init.d/myscript

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

无论有还是没有用户/组字段,都没有作用......

答案1

[已解决] 有时候,固执一点是解决问题的好办法。不过,还是感谢您的贡献。根据我之前评论的链接(Sebastian Stark 的回答)进行了一些研究后,我最终在 /etc/init.d 文件夹中找到了这个脚本(我们称之为“myoffscript”):

#!/bin/sh
### BEGIN INIT INFO
# Required-Start:    $local_fs
# Required-Stop:     $local_fs
# Provides:          Shutdown or Reboot Exec
# Default-Start:     4
# Default-Stop:      0 6
# Description:       Shutdown or Reboot
### END INIT INFO

case "$1" in
    stop)
             echo $(date) >> /ZZZdate # REPLACE PREVIOUS EXAMPLE: EXECUTE SHUTDOWN/REBOOT COMMANDS HERE
         ;;
esac

exit 0

关于上述脚本,最重要的是要强调的是:

1 - LSB(Linux 标准基础)标头– 'Default-Start' 和 'Default-Stop' 运行级别必须同时存在,'0' 对应关机 (rc0.d) 而 '6' 对应重启 (rc6.d)。由于我的脚本仅用于关机和重启,并且必须指定 'Default-Start',因此我选择了 '4' (rc4.d),它未使用/用户可定​​义。但如果需要在启动时启动某些东西(如服务、守护进程等),则应为运行级别 '2' (rc2.d)

2 - 案例陈述- 由于脚本由systemd作为一个服务根据 LSB 标头中的‘Default-Start’和‘Default-Stop’,使用参数‘start’或‘stop’,所有命令都必须位于 case 语句内。(在我的测试中,case 语句之前的命令被忽略了。)对应于运行级别“0”和“6”,我的case语句只有停止)选项,但如果需要在启动时运行,开始)选项应该被包含(并且必须在 LSB 标头‘Default-Start’中指定运行级别‘2’)。

现在,让我们开始工作。首先使脚本 /etc/init.d/myoffscript 可执行。然后,我们有两个选择 - 使用命令或者手动

使用命令

# systemctl enable myoffscript

或者

# /lib/systemd/systemd-sysv-install enable myoffscript

相对符号链接将自动创建在相应的 rc*.d 文件夹中(根据上述脚本,S01myoffscript 在 rc4.d 中,K01myoffscript 在 rc0.d 和 rc6.d 中)。仅当之前未创建链接时,这些命令才会起作用。否则将报告错误。

手动:从每个 rc*.d 文件夹创建符号链接

# cd /etc/rc4.d
# ln -s ../init.d/myoffscript S01myoffscript
# cd /etc/rc0.d
# ln -s ../init.d/myoffscript K01myoffscript
# cd /etc/rc6.d
# ln -s ../init.d/myoffscript K01myoffscript

注意:如果在“Default-Start”中指定了运行级别“2”,则应在/etc/rc2.d 中创建第一个链接,依此类推...重新启动系统,一切都应该正常工作。

这是我发现的唯一一种在 Ubuntu 20.04 关机和重启时以 root 身份运行脚本的方法

注意:尽管/etc/int.d/etc/rc2.dlinks 方法仍然可以在启动时运行脚本/命令,正如我在之前的评论链接中提到的那样,长期方法是将 init 脚本转换为 systemd 服务单元因此,上面描述的带有 case 语句方法的 LBS 标头可能在某些时候对启动脚本/命令有用。

相关内容