在旧时代是使用update-rc.d
命令来操作的,具体步骤可以查阅网上其他资料,在这里介绍使用systemctl
命令来更加优雅地实现。
0x01 编写脚本
脚本存放在/etc/init.d
位置下,文件名如 hello
,记得加上可执行权限。
sudo vi /etc/init.d/hello
sudo chmod +x /etc/init.d/hello
脚本将由root
用户自动执行,编写时涉及到文件等一些权限操作时注意一下就好。
对于脚本的内容。。。emmm..确实是有点格式要求的,一开始我直接就撸了一句
echo "hello" >> /home/ubuntu/log
然而并无卵用,正确的姿势应该是这样的,最简单的脚本如下:
#!/bin/sh
### BEGIN INIT INFO
# Default-Start: 2 3 4 5
# Default-Stop: 0 1 6
### END INIT INFO
echo "hello world" >> /home/ubuntu/log
开头的那几行注释,一句都必不可少,shell可以换成#!/bin/bash
,也可以是其他的都行。但必须有指定脚本所使用的shell。注释完后就是自己写的脚本内容了,我这里只是随便hello了一下。
Default-Start、 Default-Stop 是指脚本在哪个runlevel被执行,以上的2345是最常见的运行等级,一般脚本都这样写就行了。
详情点我看Linux标准
0x02 设置脚本开机自启动
这里就可以优雅地使用systemctl
命令了,一句话搞定:
sudo systemctl enable hello
如果脚本里那几行注释没有缺少的话,是不会有任何报错的。
如果出现
update-rc.d: error: XXX Default-Start contains no runlevels, aborting.
意味着,脚本里缺少了运行级别的说明,并不知道什么时候启动。
如果没有指定shell,脚本可能无法成功执行。
0x03 Good Luck
sudo reboot
重启几次看看脚本执行成功了没有吧~~~每一次重启,那个log文件都会多一句hello world
。
0x04 取消脚本开机自启动
sudo systemctl disable hello
0x05 调整启动顺序
有些程序需要先有网络才能顺利启动,可以采用官方的例子,调整启动顺序:
# Required-Start: $local_fs $network $remote_fs
就是在有网、本地文件系统、远程文件系统都就绪情况下再启动本服务。
### BEGIN INIT INFO
# Provides: lsb-ourdb
# Required-Start: $local_fs $network $remote_fs
# Required-Stop: $local_fs $network $remote_fs
# Default-Start: 2 3 4 5
# Default-Stop: 0 1 6
# Short-Description: start and stop OurDB
# Description: OurDB is a very fast and reliable database
# engine used for illustrating init scripts
### END INIT INFO
Linux就是这么简单优雅~❤❤❤