启动时初始化无限循环 (shell/Openwrt)
Init infinite loop on bootup (shell/Openwrt)
我一直在尝试在OpenWRT中生成无限循环,我成功了:
#!/bin/sh /etc/rc.common
while [ true ]
do
# Code to run
sleep 15
done
如果我以 ./script 的形式执行这段代码,它会很有用。但是,我希望它在我打开路由器时自行启动。我已将脚本放在 /etc/init.d
中并使用 chmod +x script
启用它。
无论如何,程序根本不会启动 运行。我的猜测是我不应该在启动时执行这个脚本,而是有一个调用这个其他脚本的脚本。我没能解决这个问题。
如有任何帮助,我们将不胜感激。
您需要在 /etc/rc.d/
中有一个带有 Sxx
前缀的文件,以便系统在启动时执行脚本。这通常是通过 /etc/init.d
中的脚本和 /etc/rc.d
中指向脚本的符号链接来实现的。
S
指示脚本在启动时应 运行 而 xx
指示脚本将 运行 的顺序。脚本以自然递增的顺序执行:S10boot
运行s 在 S40network
之前和 S50cron
运行s 在 S50dropbear
.
之前
请记住,系统可能无法继续使用您在此处显示的脚本启动!
/etc/init.d/rcS
依次调用每个脚本并等待当前脚本退出后再调用下一个脚本。由于您的脚本是一个无限循环,它永远不会退出并且 rcS
可能无法完成启动过程。
如果您在脚本中使用 start()
、stop()
、restart()
等函数并添加 START
和STOP
描述脚本在 boot/shutdown 期间应执行的时间的变量。
然后您的脚本可用于在启动时通过创建或删除符号链接来启用和禁用自身:/etc/init.d/myscript enable
另见 OpenWRT Boot Process and Init Scripts
-Rich Alloway (RogueWave)
因为我在之前的项目中搞砸了 OpenWRT 的初始化脚本。我想为 Rich Alloway 的回答做出贡献(对于那些可能会从 google 搜索中掉到这里的人)。他的回答仅涵盖 "traditional SysV style init scripts",因为他在 link Init Scripts.
的页面中提到了这一点
您可能会在 OpenWRT 版本中找到新的进程管理守护进程 Procd。遗憾的是它的文档还没有完成; Procd Init Scripts.
如他们在文档中指出的那样存在细微差别:
- procd expects services to run in the foreground,
- Different shebang,
- line: #!/bin/sh /etc/rc.common Explicitly use procd USE_PROCD=1
- start_service() instead of start()
procd 的简单初始化脚本如下所示:
#!/bin/sh /etc/rc.common
# it is run order of your script, make it high to not mess up with other init scripts
START=100
USE_PROCD=1
start_service() {
procd_open_instance
procd_set_param command /target/to/your/useless/command -some -useless -shit -here
}
我之前发布了一些关于它的 blog post 可能会有帮助。
我一直在尝试在OpenWRT中生成无限循环,我成功了:
#!/bin/sh /etc/rc.common
while [ true ]
do
# Code to run
sleep 15
done
如果我以 ./script 的形式执行这段代码,它会很有用。但是,我希望它在我打开路由器时自行启动。我已将脚本放在 /etc/init.d
中并使用 chmod +x script
启用它。
无论如何,程序根本不会启动 运行。我的猜测是我不应该在启动时执行这个脚本,而是有一个调用这个其他脚本的脚本。我没能解决这个问题。
如有任何帮助,我们将不胜感激。
您需要在 /etc/rc.d/
中有一个带有 Sxx
前缀的文件,以便系统在启动时执行脚本。这通常是通过 /etc/init.d
中的脚本和 /etc/rc.d
中指向脚本的符号链接来实现的。
S
指示脚本在启动时应 运行 而 xx
指示脚本将 运行 的顺序。脚本以自然递增的顺序执行:S10boot
运行s 在 S40network
之前和 S50cron
运行s 在 S50dropbear
.
请记住,系统可能无法继续使用您在此处显示的脚本启动!
/etc/init.d/rcS
依次调用每个脚本并等待当前脚本退出后再调用下一个脚本。由于您的脚本是一个无限循环,它永远不会退出并且 rcS
可能无法完成启动过程。
如果您在脚本中使用 start()
、stop()
、restart()
等函数并添加 START
和STOP
描述脚本在 boot/shutdown 期间应执行的时间的变量。
然后您的脚本可用于在启动时通过创建或删除符号链接来启用和禁用自身:/etc/init.d/myscript enable
另见 OpenWRT Boot Process and Init Scripts
-Rich Alloway (RogueWave)
因为我在之前的项目中搞砸了 OpenWRT 的初始化脚本。我想为 Rich Alloway 的回答做出贡献(对于那些可能会从 google 搜索中掉到这里的人)。他的回答仅涵盖 "traditional SysV style init scripts",因为他在 link Init Scripts.
的页面中提到了这一点您可能会在 OpenWRT 版本中找到新的进程管理守护进程 Procd。遗憾的是它的文档还没有完成; Procd Init Scripts.
如他们在文档中指出的那样存在细微差别:
- procd expects services to run in the foreground,
- Different shebang,
- line: #!/bin/sh /etc/rc.common Explicitly use procd USE_PROCD=1
- start_service() instead of start()
procd 的简单初始化脚本如下所示:
#!/bin/sh /etc/rc.common
# it is run order of your script, make it high to not mess up with other init scripts
START=100
USE_PROCD=1
start_service() {
procd_open_instance
procd_set_param command /target/to/your/useless/command -some -useless -shit -here
}
我之前发布了一些关于它的 blog post 可能会有帮助。