前几天给公司新装了一台双路2080Ti主机作为我们计算的服务器 【双路RTX 2080Ti】机器学习工作站配置清单及拆箱装机(多图,初创公司福利,程序猿的最爱) - 摩金的文章 - 知乎) 因为使用的是现在最新的稳定版Ubuntu Server 18.04,发现以前开机自启的方法失效了,Ubuntu 18 相比以往的几个版本改动较大,不再使用
initd
管理系统,而是使用systemd
,要像以前使用rc.local需要做一些修改。 查阅网上的一些教程发现没有正常启动,最后发现是缺少一些启动命令。
注:下文所使用编辑器是Vim,如果需要使用其他编辑器请自行更换命令中的vim
如果有排版不清等问题欢迎前往我的博客阅读:
ubuntu 18.04 server 开机自动启动脚本 svn ngrok 自动启动 rc.localblog.djinguo.com
修改rc.local.service
systemd 默认读取 /etc/systemd/system 下的文件,该目录下的文件会链接/lib/systemd/system/下的文件。
执行 ls /lib/systemd/system
你可以看到有很多启动脚本,其中就有我们需要的 rc.local.service
想要深入了解Linux的
init
进程和systemd
可以参考下面的博客: Systemd 入门教程
首先修改rc.local.service
sudo vim /lib/systemd/system/rc.local.service
在最后加入[Install]内容:
[Install]
WantedBy=multi-user.target
Alias=rc-local.service
修改完成后的文件如下:
[Unit]
Description=/etc/rc.local Compatibility
Documentation=man:systemd-rc-local-generator(8)
ConditionFileIsExecutable=/etc/rc.local
After=network.target
[Service]
Type=forking
ExecStart=/etc/rc.local start
TimeoutSec=0
RemainAfterExit=yes
GuessMainPID=no
[Install]
WantedBy=multi-user.target
Alias=rc-local.service
通过网上资料了解到
一般正常的启动文件主要分成三部分
[Unit] 段: 启动顺序与依赖关系; [Service] 段: 启动行为,如何启动,启动类型; [Install] 段: 定义如何安装这个配置文件,即怎样做到开机启动;
可以看出,/etc/rc.local 的启动顺序是在网络后面,但是显然它少了 Install 段,也就没有定义如何做到开机启动,所以显然这样配置是无效的。 因此我们就需要在后面帮他加上 [Install] 段。
创建rc.local脚本
注意到 Ubuntu 18.04 默认没有/etc/rc.local这个文件,需要自己创建:
sudo vim /etc/rc.local
向其中写入:
#!/bin/bash
svnserve -d -r /home/svn/repository/
/home/ngrok -log=/home/ngrok.log -config=/home/ngrok.cfg start ssh
# 这里还可以加入其它想要自启的命令
echo "this is a test" > /usr/local/text.log
可以看到,第一行是表明这是一个bash文件;
中间两行是我们的自启命令,这里是自动启动SVN和ngrok(和我们平时的启动命令一样);
最后是一个测试输出日志(可以省略),开机后打开/usr/local/text.log就知道有没有成功自启。
创建软链接
前面我们说 systemd 默认读取 /etc/systemd/system 下的配置文件, 所以还需要在 /etc/systemd/system 目录下创建软链接
ln -s /lib/systemd/system/rc.local.service /etc/systemd/system/
systemctl 启动 问题研究并解决
之前按照相关教程没有顺利自启,在论坛中找到一个命令使用后成功,可能是将服务告知系统自启的命令。
systemctl enable rc-local
后来又发现:
Systemd 默认从目录/etc/systemd/system/读取配置文件。但是,里面存放的大部分文件都是符号链接,指向目录/usr/lib/systemd/system/,真正的配置文件存放在那个目录。 systemctl enable命令用于在上面两个目录之间,建立符号链接关系。
sudo systemctl enable rc-local
# 等同于
sudo ln -s '/usr/lib/systemd/system/rc-local' '/etc/systemd/system/multi-user.target.wants/rc-local'
如果配置文件里面设置了开机启动,systemctl enable命令相当于激活开机启动。
与之对应的,systemctl disable命令用于在两个目录之间,撤销符号链接关系,相当于撤销开机启动。
sudo systemctl disable rc-local
所以说之前问题可能出现在上一步软链接创建失败,或者说光创建链接未激活开机启动。
到此,执行reboot
命令重新启动主机,发现相关服务已经成功启动了。
参考链接
ubuntu 18.04 - server版 开机启动脚本
ubuntu 18.04 下如何增加开机启动的命令??? RC local 不管用。。。
Systemd 入门教程:命令篇