OpenWrt的开机启动服务(init scripts)_IOsetting的博客-程序员宝宝

技术标签: OpenWRT  python  java  shell  linux  mysql  

SysV风格的init启动

参考 https://wiki.openwrt.org/doc/techref/initscripts

以一个简单的例子来说明

#!/bin/sh /etc/rc.common
# Example script
# Copyright (C) 2007 OpenWrt.org
 
START=10
STOP=15
 
start() {        
        echo start
        # commands to launch application
}                 
 
stop() {          
        echo stop
        # commands to kill application 
}

第一行shebang #! 使用 /bin/sh /etc/rc.common 作为脚本解释器并在执行脚本前调用 main 和检查脚本

公用的 init script 方法有

start   # 启动服务
stop    # 停止服务
restart # 重启服务
reload  # 重新载入配置文件, 如果失败则重启
enable  # 启用开机自启动, 实际上是在/etc/rc.d/下创建S??和K??开头的软链
disable  # 禁用开机自启动, 实际上是删除/etc/rc.d/下对应的软链

脚本中 start() 和 stop() 是必须的

启动顺序

START= 和 STOP= 决定脚本启动时的次序. 启动时init.d会根据文件名顺序, 自动执行在/etc/rc.d中找到的脚本. 初始化脚本可以作为/etc/init.d/下文件的软链放置在/etc/rc.d/.
enable 和 disable 可以自动帮你创建对应的带序号的软链.
这个例子中START=10 会被链接到 /etc/rc.d/S10example, 启动时执行在START=9之后, 在START=11之前. 而STOP=15会被链接到 /etc/rc.d/K15example, 执行在STOP=14之后, 在STOP=16之前. 同一个启动数字的, 按字母顺序启动.

脚本中的 boot()
当存在boot()方法时, 系统启动时会调用boot()而不是start()

boot() {
    echo boot
    # commands to run on boot
}

你可以使用EXTRA_COMMANDS和EXTRA_HELP设置自定义的服务方法

EXTRA_COMMANDS="custom"
EXTRA_HELP="        custom  Help for the custom command"

custom() {
    echo "custom command"
    # do your custom stuff
}

多个自定义方法的添加

EXTRA_COMMANDS="custom1 custom2 custom3"
EXTRA_HELP=<<EOF
    custom1 Help for the custom1 command
    custom2 Help for the custom2 command
    custom3 Help for the custom3 command
EOF

custom1 () {
    echo "custom1"
    # do the stuff for custom1
}
custom2 () {
    echo "custom2"
    # do the stuff for custom2
}
custom3 () {
    echo "custom3"
    # do the stuff for custom3
}

快速查询所有服务的自启动状态, 可以使用以下命令

[email protected]:~# for F in /etc/init.d/* ; do $F enabled && echo $F on || echo $F **disabled**; done
/etc/init.d/boot on
/etc/init.d/bootcount on
/etc/init.d/cron on
/etc/init.d/dnsmasq on
/etc/init.d/done on
/etc/init.d/dropbear on
/etc/init.d/firewall on
/etc/init.d/fstab on
/etc/init.d/gpio_switch on
/etc/init.d/led on
/etc/init.d/log on
/etc/init.d/network on
/etc/init.d/odhcpd on
/etc/init.d/rpcd on
/etc/init.d/samba on
/etc/init.d/ss-libev on
/etc/init.d/sysctl on
/etc/init.d/sysfixtime on
/etc/init.d/sysntpd on
/etc/init.d/system on
/etc/init.d/transmission on
/etc/init.d/uhttpd on
/etc/init.d/umount **disabled**
/etc/init.d/wifidog **disabled**

procd风格的init启动

procd init脚本与sysv风格的启动脚本区别在于

  • procd方式下, 服务必须以前台方式运行
  • 不同的shebang line: #!/bin/sh /etc/rc.common
  • 指定procd方式的声明 USE_PROCD=1

例如

#!/bin/sh /etc/rc.common

USE_PROCD=1

脚本格式说明

#!/bin/sh /etc/rc.common
# Copyright (C) 2008 OpenWrt.org    

# 启动的顺序,越大越靠后
START=98
# 停止的顺序, 越小越靠前
STOP=15

# 声明使用procd
USE_PROCD=1

BINLOADER_BIN="/usr/bin/binloader"

# start_service 函数必须要定义
start_service() {
  # 创建一个实例, 在procd看来一个应用程序可以多个实例
  # ubus call service list 可以查看实例
  procd_open_instance
  # 告知procd当binloader程序退出后尝试进行重启
  procd_set_param respawn
  # binloader执行的命令是"/usr/bin/binloader", 若后面有参数可以直接在后面加上
  procd_set_param command "$BINLOADER_BIN"
  # 关闭实例
  procd_close_instance
}

# 定义退出服务器后需要做的操作
stop_service() {
  rm -f /var/run/binloader.pid
}

reload_service() {
  procd_send_signal clash
}

restart() {
  stop
  start
}

常用的start_service()语句

start_service() {
  procd_open_instance [instance_name]
  procd_set_param command /sbin/your_service_daemon -b -a --foo # service executable that has to run in **foreground**.
  procd_append_param command -bar 42 # append command parameters

  # respawn automatically if something died, be careful if you have an alternative process supervisor
  # if process dies sooner than respawn_threshold, it is considered crashed and after 5 retries the service is stopped
  procd_set_param respawn ${respawn_threshold:-3600} ${respawn_timeout:-5} ${respawn_retry:-5}

  procd_set_param env SOME_VARIABLE=funtimes  # pass environment variables to your process
  procd_set_param limits core="unlimited"  # If you need to set ulimit for your process
  procd_set_param file /var/etc/your_service.conf # /etc/init.d/your_service reload will restart the daemon if these files have changed
  procd_set_param netdev dev # likewise, except if dev's ifindex changes.
  procd_set_param data name=value ... # likewise, except if this data changes.
  procd_set_param stdout 1 # forward stdout of the command to logd
  procd_set_param stderr 1 # same for stderr
  procd_set_param user nobody # run service as user nobody
  procd_set_param pidfile /var/run/somefile.pid # write a pid file on instance start and remove it on stop
  procd_close_instance
}

被procd执行的程序不能是daemon后台程序,因为后台程序的主进程退出后在procd看来就是程序退出了,然后会进入respawn流程,之后重复启动和退出, 最后失败:

procd: Instance binloader::instance1 s in a crash loop 6 crashes, 0 seconds since last crash

参考

https://oldwiki.archive.openwrt.org/inbox/procd-init-scripts

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/michaelchain/article/details/119629217

智能推荐

Ubuntu16.04下Python OpenCV with CUDA 安装及配置_青支的博客-程序员宝宝

环境Ubuntu 16.04python 3.5(系统自带的!不要用Anaconda装会踩坑详见参考4,但我按参考4的方法调整了还是不行,无奈之下搞了一个新的docker环境来装opencv)CUDA 8.0下载mkdir opencv_cudacd opencv_cudagit clone https://github.com/opencv/opencv.gitcd open...

怎么判断一个url是qq.com_Sophia1010的博客-程序员宝宝

首先你想到的是什么呢? loacation.host.indexOf(‘qq.com’)>-1, 有一个问题我们现在是判断一个字符串是否是url, 跟location没什么关系哈,哪怕有关系这个真的对吗。正常的正则是匹配 /^(http:|https:)\/\/([\w-]+.)+qq.com\//.test(url) 看起来是不错哦。你访问http://[email protected]

MySQL备份工具_weixin_33725239的博客-程序员宝宝

MySQL备份工具常用的 MySQL 备份工具• 物理备份缺点– 跨平台性差– 备份时间长、冗余备份、浪费存储空间• mysqldump 备份缺点– 效率较低,备份和还原速度慢– 备份过程中,数据插入和更新操作会被挂起XtraBackup 工具• 一款强大的在线热备份工具– 备份过程中不锁库表,适合生产环境– 由专业组织 Percona 提供(改进 MySQL 分支)• 主要含两个组件– xtr...

问题排查--Kylin开启G1垃圾回收算法导致进程无法启动_skyyws的博客-程序员宝宝

Kylin的JVM参数可以通过修改$conf/setenv.sh中的KYLIN_JVM_SETTINGS参数来进行配置,默认使用的GC算法是ParNew+CMS,我们可以通过jcmd pid VM.flags来查看进程的JVM参数,如下所示:最近由于查询和任务变多,Kylin节点在高峰期会出现由于GC导致服务停顿时间比较久的情况,因此准备将GC算法调整为G1,我们直接修改KYLIN_JVM_SETTINGS,如下所示:export KYLIN_JVM_SETTINGS="-Xms128G -Xmx12

Java REST JAX-RS 2.0 –如何处理日期,时间和时间戳记数据类型_dnc8371的博客-程序员宝宝

无论是X-Form-Urlencoded还是JSON HTTP发布到REST资源端点,对于与日期或时间相关的数据都没有特定的“数据类型”。 大多数开发人员会将这些数据发布为“字符串”,或者只是将它们转换为Unix时间戳值(例如1435061152)。 但是,随着开发人员实现越来越多的端点方法,将日期,时间和时间戳字符串表示值解析为实际java.sql.Date或java.util.Date的...

《机器学习》读书笔记——第一章 绪论__Lilly的博客-程序员宝宝

本章内容是在阅读《机器学习》的过程中记录的学习笔记,这本书是机器学习领域的经典书籍,作者是周志华老师。目录引言基本术语假设空间归纳偏好引言机器学习致力于研究如果通过计算的手段,利用经验来改善系统自身的性能。机器学习所研究的主要内容,是关于在计算机上从数据中产生“模型”(model)的算法。本书中用“模型”泛指从数据中学得的结果。[Mitchell,1997]给出了一个更形式化的定义:假设用P来评估计算机程序在某任务类T上的性能,如果一个程序通过利用经验E在T中任务上获得了性能改善,则我们

随便推点

Springboot请求的URL中含有‘:‘、‘/‘等转义字符导致404错误问题_MTonj的博客-程序员宝宝_springboot url转义

本来在上一次解决“Springboot用@PathVariable传参,最后一个参数小数点(.)后面数据丢失问题”时,花费了一些时间,解决了问题。但是没想到此次项目中的请求URL含有的不仅仅是一个小数点这么简单的,更多的是各种特殊字符的混搭。例如下面的一个请求:(delete方式)http://localhost:8088/backend/api/v2/users/[email protected]/element/http%3A%2F%2Ftext-add%3A8090%2Foperation%2Ft

安装 laravel elasticsearch_weixin_30270889的博客-程序员宝宝

安装elasticsearch和ik插件 (elasticsearch的使用需要配置java环境,自行百度配置好java环境)elasticsearch集成包(包括ik中文插件)安装地址:https://github.com/medcl/elasticsearch-rtf测试安装 启动elasticSearch:bin/elasticSearch-d win...

小甲鱼python课后题和答案简书_【py小甲鱼笔记】-元组_weixin_39844963的博客-程序员宝宝

P13 :元组 :戴上了枷锁的列表要点:print(dir(tuple))查出元组有那些方法,主要是tuple.count,tuple.index,可以使用help(tuple)、help(tuple.count)、help(tuple.index),知道它们的用法元组和列表最大的区别:列表中的元素可以任意修改,可以任意插入或者删除一个元素,而元组不行,元组是不可变的(像字符串一样),所有别指望对...

r中gglot怎么组合多张图_【R:ggplot2】同时绘制多个图_weixin_39788703的博客-程序员宝宝

1.利用facet_grid代码如下:准备数据inifinat1t2titfti$DynaOrNottf$DynaOrNottemptemp$Namefor(i in c(2:10)) {titfti$DynaOrNottf$DynaOrNottt$Nametemp}利用Name区分分面,其中Name.代表分面标签在右,.Name代表分面标签在上ggplot(temp)+geom_bar(aes(...

pygame飞机大战7_qin_shang_的博客-程序员宝宝

if me_destroy_index == 0:                        life_num -= 1                        me.reset()                        pygame.time.set_timer(INVINCIBLE_TIME, 3 * 1000)if enemies_down and not me.invin...

推荐文章

热门文章

相关标签