ubuntu 设置开机自启

今天在给客户配置生产环境物理服务器时,遇到个坑,在16.04版本以及之前版本都只需要在”/etc/rc.local”文件的”exit 0;”前加要执行的命令即可,但是客户那边服务器是18.04,etc目录下根本没有rc.local文件,整了半天才知道是升级过后,ubuntu做了改动,具体配置方法如下:

ubuntu-16.10 开始不再使用initd管理系统,改用systemd

systemd is now used for user sessions. System sessions had already been provided by systemd in previous Ubuntu releases.

快速看了 systemd 的使用方法,发现改动有点大, 包括用 systemctl 命令来替换了 service 和 chkconfig 的功能。

比如以前启动 mysql 服务用:

  1. sudo service mysql start

现在用:

  1. sudo systemctl start mysqld.service

其实这个改动到不是算大,主要是开机启动比以前复杂多了。

systemd 默认读取 /etc/systemd/system 下的配置文件,该目录下的文件会链接/lib/systemd/system/下的文件。
执行 ls /lib/systemd/system 你可以看到有很多启动脚本,其中就有我们需要的 rc.local.service
打开脚本内容:

  1. # This file is part of systemd.
  2. #
  3. # systemd is free software; you can redistribute it and/or modify it
  4. # under the terms of the GNU Lesser General Public License as published by
  5. # the Free Software Foundation; either version 2.1 of the License, or
  6. # (at your option) any later version.
  7. # This unit gets pulled automatically into multi-user.target by
  8. # systemd-rc-local-generator if /etc/rc.local is executable.
  9. [Unit]
  10. Description=/etc/rc.local Compatibility
  11. ConditionFileIsExecutable=/etc/rc.local
  12. After=network.target
  13. [Service]
  14. Type=forking
  15. ExecStart=/etc/rc.local start
  16. TimeoutSec=0
  17. RemainAfterExit=yes
一般正常的启动文件主要分成三部分
  • [Unit] 段: 启动顺序与依赖关系 
- [Service] 段: 启动行为,如何启动,启动类型 
- [Install] 段: 定义如何安装这个配置文件,即怎样做到开机启动

可以看出,/etc/rc.local 的启动顺序是在网络后面,但是显然它少了 Install 段,也就没有定义如何做到开机启动,所以显然这样配置是无效的。 因此我们就需要在后面帮他加上[Install] 段:

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

这里需要注意一下,ubuntu-18.04 默认是没有 /etc/rc.local 这个文件的,需要自己创建

  1. sudo vim /etc/rc.local

写入以下内容:

  1. #!/bin/sh -e
  2. #
  3. # rc.local
  4. #
  5. # This script is executed at the end of each multiuser runlevel.
  6. # Make sure that the script will "exit 0" on success or any other
  7. # value on error.
  8. #
  9. # In order to enable or disable this script just change the execution
  10. # bits.
  11. #
  12. # By default this script does nothing.
  13. # 这里写入你要执行的命令;或者脚本(16.04之前版本只需要操作这里就ok了)
  14. exit 0

然后把你需要启动脚本写入 /etc/rc.local ,我们不妨写一些测试的脚本放在里面,以便验证脚本是否生效.

  1. echo "this just a test" > /usr/local/text.log

做完这一步,还需要最后一步 前面我们说 systemd 默认读取 /etc/systemd/system 下的配置文件, 所以还需要在 /etc/systemd/system 目录下创建软链接

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

给rc.local加上权限

  1. sudo chmod +x /etc/rc.local

启用服务

  1. sudo systemctl enable rc-local

启动服务并检查状态

  1. sudo systemctl start rc-local.service
  2. sudo systemctl status rc-local.service

接下来,重启系统,然后看看 /usr/local/text.log 文件是否存在就知道开机脚本是否生效了。检查test.log文件

  1. cat /usr/local/test.log

您的支持是对我最大的鼓励!