Fork me on GitHub

Ubuntu Server 18.04.1 LTS 开机自动启动脚本 SVN Ngrok 自动启动 rc.local

前几天给公司新装了一台双路2080Ti主机作为我们计算的服务器
【双路RTX 2080Ti】机器学习工作站配置清单及拆箱装机(多图,初创公司福利,程序猿的最爱) - 摩金的文章 - 知乎
因为使用的是现在最新的稳定版Ubuntu Server 18.04,发现以前开机自启的方法失效了,Ubuntu 18 相比以往的几个版本改动较大,不再使用initd管理系统,而是使用systemd,要像以前使用rc.local需要做一些修改。
查阅网上的一些教程发现没有正常启动,最后发现是缺少一些启动命令。

注:下文所使用编辑器是Vim,如果需要使用其他编辑器请自行更换命令中的vim

修改rc.local.service

systemd 默认读取 /etc/systemd/system 下的文件,该目录下的文件会链接/lib/systemd/system/下的文件。

执行 ls /lib/systemd/system 你可以看到有很多启动脚本,其中就有我们需要的 rc.local.service

想要深入了解Linux的init进程和systemd可以参考下面的博客:
Systemd 入门教程

首先修改rc.local.service

1
sudo vim /lib/systemd/system/rc.local.service

在最后加入[Install]内容:

1
2
3
[Install]
WantedBy=multi-user.target
Alias=rc-local.service

修改完成后的文件如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
[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这个文件,需要自己创建:

1
sudo vim /etc/rc.local

向其中写入:

1
2
3
4
5
6
7
#!/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 目录下创建软链接

1
ln -s /lib/systemd/system/rc.local.service /etc/systemd/system/

systemctl 启动 问题研究解决

之前按照相关教程没有顺利自启,在论坛中找到一个命令使用后成功,可能是将服务告知系统自启的命令。

1
systemctl enable rc-local

后来又发现:

Systemd 默认从目录/etc/systemd/system/读取配置文件。但是,里面存放的大部分文件都是符号链接,指向目录/usr/lib/systemd/system/,真正的配置文件存放在那个目录。
systemctl enable命令用于在上面两个目录之间,建立符号链接关系。

1
2
3
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命令用于在两个目录之间,撤销符号链接关系,相当于撤销开机启动。

1
sudo systemctl disable rc-local

所以说之前问题可能出现在上一步软链接创建失败,或者说光创建链接未激活开机启动。

到此,执行reboot命令重新启动主机,发现相关服务已经成功启动了。

参考链接

ubuntu 18.04 - server版 开机启动脚本

ubuntu 18.04 下如何增加开机启动的命令??? RC local 不管用。。。

Systemd 入门教程:命令篇

文章作者:Jinguo Dong (董金国)

最后更新:2019年01月30日 13:01:33

原始链接:http://blog.djinguo.com/2019-01-30/ubuntu-18-start/

版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 3.0 许可协议,转载请注明出处!

0%