如何优雅地实现Ubuntu/CentOS等Linux系统开机自启动自定义脚本

在旧时代是使用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就是这么简单优雅~❤❤❤

你可能感兴趣的:(如何优雅地实现Ubuntu/CentOS等Linux系统开机自启动自定义脚本)