我一直在尝试在OpenWRT中生成无限循环,并且我成功了:
#!/bin/sh /etc/rc.common
while [ true ]
do
# Code to run
sleep 15
done
如果我以./script的形式执行它,这段代码就像一个魅力。但是,当我打开路由器时,我想让它自己启动。我已将脚本放在/etc/init.d
中,并使用chmod +x script
启用它。
无论如何,该程序根本没有开始运行。我的猜测是我不应该在启动时执行这个脚本,而是有一个调用这个其他脚本的脚本。我无法解决这个问题。
任何帮助都将不胜感激。
答案 0 :(得分:2)
因为我在以前的项目中搞乱了OpenWRT的init脚本。我想为Rich Alloway的答案做出贡献(对于那些可能会从谷歌搜索中删除的人)。他的答案仅涵盖“传统的SysV样式初始化脚本”,因为在页面中提到了他提供的链接Init Scripts。
您可以在OpenWRT版本中找到新的流程管理守护程序Procd。遗憾的是,它的文件尚未完成; Procd Init Scripts
他们的文档中指出了一些细微差别:
- procd期望服务在前台运行,
- 不同的shebang,
- 行:#!/ bin / sh /etc/rc.common明确使用procd USE_PROCD = 1
- start_service()而不是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可能有所帮助。
答案 1 :(得分:1)
您需要在/etc/rc.d/
中使用Sxx
前缀的文件,以便系统在引导时执行脚本。这通常是通过将/etc/init.d
中的脚本和/etc/rc.d
中的符号链接指向脚本来完成的。
S
表示脚本应该在启动时运行,而xx
指示脚本将运行的顺序。脚本按自然递增的顺序执行:S10boot
在S40network
之前运行,S50cron
在S50dropbear
之前运行。
请记住,系统可能无法继续使用您在此处显示的脚本启动!
/etc/init.d/rcS
按顺序调用每个脚本,并在调用下一个脚本之前等待当前脚本退出。由于您的脚本是无限循环,因此它永远不会退出,rcS
可能无法完成启动过程。
如果您在脚本中使用/etc/rc.common
,start()
,stop()
等功能并添加restart()
和{{},则包含START
会更有用1}}变量,描述在引导/关闭期间何时执行脚本。
然后,您可以通过创建或删除符号链接来使用您的脚本在启动时启用和禁用它:STOP
另请参阅OpenWRT Boot Process和Init Scripts
-Rich Alloway(RogueWave)