简介
ubuntu作为服务器使用时,常常需要在机器重启时能自动启动我们开发的服务。
Ubuntu 16.10
开始不再使用initd
管理系统,改用systemd
,包括用systemctl
命令来替换了service
和chkconfig
的功能。
systemd
默认读取 /etc/systemd/system
下的配置文件,该目录下的文件会链接/lib/systemd/system/
下的文件。
不同于以往的版本,ubuntu18.04默认不带/etc/rc.local
文件,我们需要通过配置来让rc.local.service
生效。
然后我们就可以像以前那样,直接把启动脚本写入/etc/rc.local
文件,这样机器启动时就会自动运行它。
除了常规的设置启动脚本以外,本文还介绍一下通用的添加自动启动服务的一般方法。
rc.local启动脚本
- 查看所有服务
-
ls /lib/systemd/system
,可以看到很多服务,这样不便于确认指定的服务是否存在 -
ls /lib/systemd/system | grep rc
,找到我们关心的rc.local.service
服务
- 修改服务配置
sudo vi /lib/systemd/system/rc.local.service
- 打开后可以看到,文件包含[Unit]和[Service]两个部分内容
- 一般启动文件需要三个部分:
- [Unit] 启动顺序与依赖关系
- [Service] 启动行为, 如何启动,启动类型
- [Install] 定义如何安装这个配置文件,即怎样做到开机启动
- 在文件最后加入以下内容:
[Install]
WantedBy=multi-user.target
Alias=rc-local.service
- 创建执行文件
sudo vi /etc/rc.local
- 写入以下内容:
#!/bin/sh -e
#
# rc.local
#
# This script is executed at the end of each multiuser runlevel.
# Make sure that the script will "exit 0" on success or any other
# value on error.
#
# In order to enable or disable this script just change the execution
# bits.
#
# By default this script does nothing.
echo "this shows rc.local is start onboot" > /usr/local/rc-local-info.log
# add your scritp here
exit 0
- 为rc.local加执行权限:
sudo chmod +x /etc/rc.local
- 建立软链接
- systemd 默认读取 /etc/systemd/system 下的配置文件, 所以还需要在 /etc/systemd/system 目录下创建软链接
sudo ln -s /lib/systemd/system/rc.local.service /etc/systemd/system/
- 启用服务并启动
sudo systemctl enable rc-local
sudo systemctl start rc-local.service
sudo systemctl status rc-local.service
- 重启检查:
cat /usr/local/rc-local-info.log
通用服务创建
请按以下步骤进行:
- 创建一个systemd服务
- 比如创建名为
my-serverA
的服务:sudo vi /etc/systemd/system/my-serverA.service
- 将以下内容写入文件:
[Unit]
Description=/etc/my_serverA.sh Compatibility
ConditionPathExists=/etc/my_serverA.sh
[Service]
Type=forking
ExecStart=/etc/my_serverA.sh start
TimeoutSec=0
StandardOutput=tty
RemainAfterExit=yes
SysVStartPriority=99
[Install]
WantedBy=multi-user.target
- 创建可执行文件my_serverA.sh
sudo vi /etc/my_serverA.sh
- 写入以下内容:
echo "this shows my_serverA.sh is start onboot" > /usr/local/my_serverA.start.log
# add your scritp here
# my_serverA
exit 0
- 为my_serverA.sh加执行权限:
sudo chmod +x /etc/my_serverA.sh
- 启用my_serverA服务
sudo systemctl enable my_serverA
- 启动服务并打印状态
sudo systemctl start my_serverA.service
sudo systemctl status my_serverA.service
- 重启以验证
cat /usr/local/my_serverA.start.log
小结
两种方法的流程大概相同,这与Linux的服务启动机制有关,只要我们设置好,服务就会自动启动。
只要掌握了一种方式,其他的都一样了。
想了解详细内容的同学,可以学习一下Linux系统启动过程,也非常有意思。