刚刚接触ubuntu、树莓派这些东西,由于有些服务每天都要用到,于是想到要做一个开机自启动的服务省去每天的繁琐步骤。
1.关于通过systemctl 的管理
首先要说的是,sysytemctl 看起来很好用,各种功能明确,但是人家管理的是服务(.service),如果随便拿来一个 .sh 的脚本让人家管理就多少有点不讲理了。
另外,关于 systemctl 的基本用法就简单说一下吧:
在 root 身份下 :
systemctl [command] [unit]
(1)[unit] 就是需要被管理的服务(结尾是 .service)
(2)[command] 可选择的有很多,不同的指令会对后面的 [unit] 产生不同的影响:
主要有start(立即启动)、stop(立即停止)、enable(开机自启动)、status(查看状态)
2.设计一个自启动脚本self_start.service
话不多说,先上图
内容其实挺简单的,注意服务要放在 /etc/systemd/system/self_start.service 这个地方(self_start.service是自己起的名字,可以换掉,下同)
关于具体内容:
[Unit]
Description= //这句是用来描述服务的具体功能的,等于号后面随便写写就好,没什么影响的
After=
//等号后面写什么就说明你的 unit 要在谁后面启动,其实这一句因人而异,不要需的话也可以不写
[service]
Type=simple
//说明这个daemon的启动方式,一般写simple就可以了,这个 daemon 会由 ExecStart 后面的命令启动,启动后将常驻于内存
ExecStart=
//就是想要自启动的命令或脚本程序,这里要写一个绝对路径,注意一定要完整!完整!
EnvironmentFile= //可以指定启动脚本的环境配置文件,需要就写这句,不需要就算了
[Install]
WantedBy=multi-user.target //反正大家都会写这么一句,写上就好了,别问我为什么
3.实现
至此,自启动的脚本我们就写好了,接下来只需要
systemctl enable self_start.service
就会自动建立一个软连接,此时我们再去查看它的状态
systemctl status self_start.service
可以看到已经成功跑起来了。
4.写在最后
实际情况肯定不会这么顺利的,你希望自启动的 .sh 脚本越复杂,面临的问题也就越多,因为不可能所有事情都像输出一句 “hello world” 那么简单。如果前面的内容都确定无误,却还是实现不了,可能要考虑微调一下自己的 .sh 脚本,比如开机后的启动顺序,是否需要延时启动;再比如说环境配置的问题。
总之,错误答案总是各有各的错误,还是要具体问题具体分析。