当一切都启动并运行时,如何在开始时运行脚本?

xak*_*p35 5 bash debian shell-script autostart

我有一台用于路由的 PC,它有 2 个网络接口并运行 Debian。我想给它添加一个声音,以表示它已启动并且没问题。

所以我创建了一些/etc/init.s/beep-startup脚本,根据绝密LSByization 手册(不能停止它的命名,抱歉),其中(连同数百个 LSB 字符串)包含几个核心命令:

### BEGIN INIT INFO
# Provides:          beep-startup
# Required-Start:    $all
# Required-Stop:     $all
# Default-Start:     2 3 4 5
# Default-Stop:      0 1 6
# Short-Description: qwer
# Description:       asdf
### END INIT INFO
case "$1" in
  start)
    #power chord + extreme uprising = fells like its clearly up and feeing good
    beep -f 220 -l 100
    beep -f 330 -l 100
    beep -f 880 -l 100
    ;;
  stop)
    # power chord + slow chirp down, feels like low descending shutdown sound, right after ctrl+alt+del or /sbin/reboot
    beep -f 440 -l 100
    beep -f 330 -l 100
    beep -f 220 -l 100
    ;;
  *)
    echo "Usage: sudo rm / -rf"
esac
Run Code Online (Sandbox Code Playgroud)

然后,当然,我碰到chmod +xupdate-rc.d beep-startup defaults

但现在的诀窍是,当我看到它在运行时,系统在启动过程中会发出实际的哔哔声,而不是在弹出登录提示时发出哔哔声。所以在哔哔声和登录提示之间有 2-3 秒。啁啾声和正确路由开始之间几乎 5-7 秒(4 核 * 2ghz + 4gb DDR3 ram,对于路由器来说不是很糟糕)关机蜂鸣声很有魅力,几乎立即发生,就在 ctrl+alt+del 组合之后,因为它应该确认“关闭序列已启动”。

我想beep在它显示登录提示之前只是抒情的“纳秒” - 例如,在$all#everything(或者不管你写什么 - 将保持精确)真的完成初始化并且系统准备好显示登录提示之后。如何创建一个自动运行脚本,该脚本在系统完成所有操作后立即执行,但就在显示登录提示之前?


附注。有点抱怨,但是.. 这是一个只有控制台的路由器,没有 xorg 或其他任何东西:唯一需要的用户是root,它的大部分任务都与 root 相关。系统可以“初始化”、“运行”、“关闭”、“关闭”——不需要运行级别。在那种发行版中,Debian 是一个真正的垃圾,runlevelless Busybox init在这个意义上感觉非常“性感”。稍后我计划摆脱沉重的 Debian,转而使用类似 buildroot 的发行版。但这只会在生产中发生:只有在我稳定并弄清楚我需要什么软件之后。目前,我确实喜欢在开发和软件可用性测试阶段使用 apt 类型的“运行时”包添加可能性。到目前为止,我已经有了丰富的经验iptablesshorewallwebmin,当第一个阻塞第二个时,与阻塞 dnsmasq 一起,切断整个 WAN 连接,依此类推。我希望能找到更多用户友好的解决方案。现在的问题是关于“/etc/init.d在启动和运行所有内容后运行脚本”

Mar*_*idd 1

这里有很好的解决方案。解决方案 1:在 crontab 中创建一个 @reboot 条目来运行名为 /usr/local/bin/runonce 的脚本。

使用 mkdir -p 创建名为 /etc/local/runonce.d/ran 的目录结构。

创建脚本 /usr/local/bin/runonce 如下:

    #!/bin/sh
for file in /etc/local/runonce.d/*
do
    if [ ! -f "$file" ]
    then
        continue
    fi
    "$file"
    mv "$file" "/etc/local/runonce.d/ran/$file.$(date +%Y%m%dT%H%M%S)"
    logger -t runonce -p local3.info "$file"
done
Run Code Online (Sandbox Code Playgroud)

现在,将您想要在下次重新启动时运行的任何脚本(仅一次)放入目录 /etc/local/runonce.d 中,并适当地 chown 和 chmod +x 。运行后,您会发现它已移动到 ran 子目录,并且日期和时间附加到其名称中。您的系统日志中还会有一个条目

归功于 Dennis Williams https://serverfault.com/questions/148341/linux-schedule-command-to-run-once-after-reboot-runonce-equivalent