因为要对外提供一个演示的后台系统,内网服务器使用的是Ubuntu系统,然后使用内网穿透工具ngrok对外提供一个测试网址。测试成功后,因为每次开关机后需要重新启动内网穿透工具ngrok的命令,所以想着能把这个命令设置为开机自启动。因是第一次在ubuntu系统上设置开机启动,网络搜索了解决方案又折腾了半天时间,终于设置成功。本文把设置的方法记录下来,以备后续参考。
一、Linux 系统主要启动步骤
读取 MBR 的信息,启动 Boot Manager。
加载系统内核,启动 init 进程, init 进程是 Linux 的根进程,所有的系统进程都是它的子进程。
init 进程读取 /etc/inittab 文件中的信息,并进入预设的运行级别。通常情况下 /etc/rcS.d/ 目录下的启动脚本首先被执行,然后是/etc/rcN.d/ 目录。
根据 /etc/rcS.d/ 文件夹中对应的脚本启动 Xwindow 服务器 xorg,Xwindow 为 Linux 下的图形用户界面系统。
启动登录管理器,等待用户登录。
二、Ubuntu系统运行级别
0 系统停机状态
1 单用户或系统维护状态,只允许root用户对系统进行维护
2~5 多用户状态,其中3为字符界面,5为图形界面
6 重新启动
切换运行级别
init [0123456Ss]
例如:init 0 命令关机; init 6 命令重新启动
三、常用的两种开机执行脚本的方法有以下两种
3.1 通过 update-rc.d 管理ubuntu开机启动
update-rc.d是一个Perl脚本,是用来自动升级System V类型初始化脚本,简单来说就是哪些东西是你想要在系统引导初始化的时候运行的,哪些是希望在关机或重启时候停止的,你都可以用它来设置。这些脚本的链接位于/etc/rcN.d/下(N代表0~6),对应脚本位于/etc/init.d/下。
命令格式:
3.1.1 按指定顺序、在指定运行级别中启动或关闭
3.1.1.1 设置启动项:
update-rc.dstart
3.1.1.2 设置停止项:
update-rc.dstop
3.1.1.3 设置启动和停止可以写在一起:
update-rc.d <serviceName> start|stop <order> <runlevels>
举例:update-rc.d apachectl start 20 2 3 4 5 . stop 20 0 1 6 .
解析:表示在2、3、4、5这五个运行级别中,由小到大,第20个开始运行apachectl;在 0 1 6这三个运行级别中,第20个关闭apachectl。这是合并起来的写法,注意它有2个点号,效果等于下面方法:
update-rc.d apachectl defaults
3.1.1.4 启动和关闭级别默认,顺序为指定值NN
update-rc.d <serviceName> defaults NN # NN是一个决定启动顺序的两位数字值
3.1.2 从所有的运行级别中删除指定的启动项
update-rc.d -f <serviceName> remove
可选参数 -f 是强制删除符号链接,即使/etc/init.d/apache2仍然存在。
举例(增加开机启动脚本):
a. 新建一个脚本文件 mystart.sh
#!/bin/bash # command content echo "hello world" > /usr.local/test.log exit 0
b. 设置权限
sudo chmod 755 mystart.sh #或者 sudo chmod +x mystart.sh
c.把脚本放置到启动目录下
sudo mv mystart.sh /etc/init.d/
d.将脚本添加到启动脚本
cd /etc/init.d/sudo update-rc.d mystart.sh defaults 90
e.移除Ubuntu开机脚本
sudo update-rc.d -f mystart.sh remove
3.2 通过 rc.local 设置ubuntu开机启动
rc.local脚本是一个Ubuntu开机后会自动执行的脚本,我们可以在该脚本内添加命令行指令。该脚本位于 /etc/ 路径下,需要root权限才能修改。
通过rc.local设置开机启动比较简单。rc.local 运行在runlevel为2,3,4,5,并且运行优先级为99,也就是最低的优先级,因此我们也可以把需要开机启动的脚本加入到rc.local里面去。
该脚本具体格式(举例)如下:
#!/bin/sh -e # # rc.local # # This script is executed at the end of each multiuser runlevel. # Make sure that the script will "exit 0" on success or any other # value on error. # # In order to enable or disable this script just change the execution # bits. # # By default this script does nothing. echo "hello world" > /usr/local/test.log exit 0
注意:
一定要将命令添加在exit 0之前。里面可以直接写命令或者执行Shell脚本文件sh。
ubuntu开机启动最常用的是这两种方法,不过推荐使用第一种 update-rc.d 管理,因为这样灵活性更高,并可以解决相关依赖。