2017-02-28 120 views
1

我一直在努力,以创造和的OpenWRT无限循环,我已经成功了:初始化在启动时无限循环(壳/ OpenWrt的)

#!/bin/sh /etc/rc.common 
while [ true ] 
do 
    # Code to run 
    sleep 15 
done 

此代码的工作作为挂饰,如果我执行它。/脚本。但是,当我打开路由器时,我希望它自己开始。我已将该脚本放入/etc/init.d并通过chmod +x script启用。

无论如何,程序根本不会开始运行。我的猜测是,我不应该在启动时执行这个脚本,而是有一个脚本调用这个其他脚本。我一直无法解决这个问题。

任何帮助,将不胜感激。

回答

2

由于我在之前的项目中混淆了OpenWRT的init脚本。我想为Rich Alloway的答案做出贡献(对于那些可能会从谷歌搜索中下降的人)。他的回答只涵盖了“传统的SysV风格的初始化脚本”,因为它在页面中提到了他给出的链接Init Scripts

您可能会在OpenWRT版本中找到新的进程管理守护进程Procd。可悲的文件尚未完成; Procd Init Scripts

有细微的差别,如他们有自己的文件中指出:

  • procd预计服务在前台运行,
  • 不同的家当,
  • 行:#!/ bin中/ SH /etc/rc.common明确使用procd USE_PROCD = 1个
  • start_service()而不是开始()

一个简单的procd的init脚本会是什么样子:

#!/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

您需要在/etc/rc.d/中有一个Sxx前缀的文件,以便系统在引导时执行脚本。这通常通过使脚本在/etc/init.d和指向脚本的/etc/rc.d中的符号链接来完成。

S表示脚本应该在启动时运行,而xx指示脚本将运行的顺序。脚本按自然递增的顺序执行:S10bootS40network之前运行,S50cronS50dropbear之前运行。

请记住,系统可能无法继续使用您在此显示的脚本进行引导!

/etc/init.d/rcS按顺序调用每个脚本,并在调用下一个脚本之前等待当前脚本退出。由于您的脚本是无限循环,因此它永远不会退出并且rcS可能无法完成引导过程。

,如果你使用的功能在你的脚本一样start()stop()restart()等,并添加STARTSTOP变量时,脚本应该启动/关机期间执行其描述包括/etc/rc.common将更加有用。

那么你的脚本可以用来启用和创建或删除符号链接在开机时自行禁用:/etc/init.d/myscript enable

参见OpenWRT Boot ProcessInit Scripts

富阿洛维(RogueWave)