简介

ubuntu作为服务器使用时,常常需要在机器重启时能自动启动我们开发的服务。

Ubuntu 16.10开始不再使用initd管理系统,改用systemd,包括用systemctl命令来替换了servicechkconfig的功能。

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

不同于以往的版本,ubuntu18.04默认不带/etc/rc.local文件,我们需要通过配置来让rc.local.service生效。

然后我们就可以像以前那样,直接把启动脚本写入/etc/rc.local文件,这样机器启动时就会自动运行它。

除了常规的设置启动脚本以外,本文还介绍一下通用的添加自动启动服务的一般方法。

rc.local启动脚本

  1. 查看所有服务
  • ls /lib/systemd/system,可以看到很多服务,这样不便于确认指定的服务是否存在
  • ls /lib/systemd/system | grep rc,找到我们关心的rc.local.service服务
  1. 修改服务配置
  • sudo vi /lib/systemd/system/rc.local.service
  • 打开后可以看到,文件包含[Unit]和[Service]两个部分内容
  • 一般启动文件需要三个部分:
  • [Unit] 启动顺序与依赖关系
  • [Service] 启动行为, 如何启动,启动类型
  • [Install] 定义如何安装这个配置文件,即怎样做到开机启动
  • 在文件最后加入以下内容:
[Install]  
WantedBy=multi-user.target  
Alias=rc-local.service
  1. 创建执行文件
  • 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
  1. 建立软链接
  • systemd 默认读取 /etc/systemd/system 下的配置文件, 所以还需要在 /etc/systemd/system 目录下创建软链接
  • sudo ln -s /lib/systemd/system/rc.local.service /etc/systemd/system/
  1. 启用服务并启动
sudo systemctl enable rc-local
sudo systemctl start rc-local.service
sudo systemctl status rc-local.service
  1. 重启检查: cat /usr/local/rc-local-info.log
通用服务创建

请按以下步骤进行:

  1. 创建一个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
  1. 创建可执行文件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
  1. 启用my_serverA服务
  • sudo systemctl enable my_serverA
  1. 启动服务并打印状态
sudo systemctl start my_serverA.service
sudo systemctl status my_serverA.service
  1. 重启以验证

cat /usr/local/my_serverA.start.log

小结

两种方法的流程大概相同,这与Linux的服务启动机制有关,只要我们设置好,服务就会自动启动。

只要掌握了一种方式,其他的都一样了。

想了解详细内容的同学,可以学习一下Linux系统启动过程,也非常有意思。