【问题标题】:Execute a script having curl call before shutdown in SysVinit在 SysVinit 中关闭之前执行具有 curl 调用的脚本
【发布时间】:2026-02-12 01:25:01
【问题描述】:

所以默认情况下我处于运行级别 3。在关机期间我切换到运行级别 0。但是如果将我的脚本(有一个 curl 调用)放在 /etc/rc0.d/ 中,我不会获得任何成功,就像在运行级别 0 网络中一样已停止,因此无法进行curl 调用。

如何得到想要的结果?

【问题讨论】:

    标签: linux centos shutdown runlevel


    【解决方案1】:

    通常在较旧的 SysVinit 系统中,启动顺序和关闭顺序由符号链接的字母数字顺序控制,这些符号链接指向位于每个运行级别目录中的初始化脚本,位于 /etc/init.d(或 /etc/rc.d/)下,其中链接编号S## (start) 在引导期间运行,K## (kill/stop) 脚本在关机期间运行。在任何给定时间点可用的服务由启动或关闭序列期间运行的内容控制。例如,较旧的 SuSE 方案是:

    /etc/init.d/
        boot.d/
        rc0.d/    # runlevel 0
        rc1.d/    # runlevel 1
        rc2.d/    # runlevel 2
        rc3.d/    # runlevel 3
            ...
            S01random           # S## - Start init script ## in order 00 -> XX
            S01resmgr
            S02consolekit
            S03haldaemon
            S05network          # network start
            ...
            K01stopblktrace     # KXX - Kill (stop) init script ## in order
            K02atieventsd
            K09cron
            ...
            K14sshd
            K15smbfs
            K16apcupsd
            K16auditd
            K16nmb
            K16portmap
            K16splash_early
            K17syslog
            K18network          # network shutdown
            ...
        rc4.d/
        rc5.d/
        rc6.d/
        rcS.d/
    

    如果您查看/etc/init.d/rc3.d/runlevel-3 的启动/关闭顺序,您会发现网络启动和关闭由启动时的S05network 和关闭时的K18network 控制。因此,如果您想创建一个自定义脚本以在网络关闭之前在关机时运行curl,您需要创建一个初始化脚本并在/etc/init.d/rc3.d 中创建一个软链接,并在网络服务之前对其进行编号(ssh 等)被删除。上面如果您创建了指向您的终止脚本K10curlonsd 的软链接并为其编号(关机时卷曲),它将在cron 关机之后运行,但在任何网络服务被取消之前运行。

    方案在centos上应该还是一样的,虽然你的/etc/init.d可能是/etc/rc.d等,但是大体的做法还是一样的。如果您有任何问题,请告诉我。

    【讨论】: