开机自启rc.local

1 rc-local.service

ls /lib/systemd/system | grep rc

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

打开之后:

一般正常的启动文件主要分成三部分

  • Unit\] 段: 启动顺序与依赖关系

  • Install\] 段: 定义如何安装这个配置文件,即怎样做到开机启动

Install

WantedBy=multi-user.target

Alias=rc-local.service

Service

2 新建并修改 rc.local 文件

sudo vim /etc/rc.local

脚本内容为:

#!/bin/sh

echo "自启动成功" > /usr/local/test.log

supervisord -c /etc/supervisor/supervisord.conf #supervisord开机启动

/etc/init.d/mysqld start # mysql开机启动

exit 0

PS:#!/bin/sh 这一行一定要加上!

PS: 如果在 /etc/rc.local 中添加的是 ./test.sh 这种类型的,要在末尾加上 &,不然重启 ubuntu 的时候会卡在启动界面进不去系统。加上 & 是让脚本启动后在后台运行的作用

PS: 你的命令,不要有死循环或无法退出的程序,不然进不了系统

如果脚本内的cmd需要sudo权限执行,则命令格式为

echo 'passward' |sudo -S cmd

3 执行权限rc.local

sudo chmod +x /etc/rc.local

4 建立软连接

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

设置权限

sudo chown root:root /etc/systemd/system/rc-local.service

sudo chmod 644 /etc/systemd/system/rc-local.service

systemd 默认从目录 /etc/systemd/system读取配置文件。但是,里面存放的大部分文件都是符号链接,真正的配置文件存放 /lib/systemd/system

注意:systemd要求软链接必须与目标名称相同 如果不同 执行systemctl enable xxx时将报 Failed to enable unit: File xxx.service: Link has been severed 错误

服务配置文件将保持在原始位置,而软链接将位于/etc/systemd/system目录下,使systemd能够找到并管理该服务。这样做的好处是,当需要修改或更新服务配置文件时,只需在原始位置进行操作,而不需要修改软链接。

注意:如果用软链接配置,disable服务时,会将/etc/systemd/system下的.service软链接删除;但是如果是普通文件方式,disable服务时,不会将/etc/systemd/system下的.service文件删除

5 开启服务

启动服务查看启动状态

sudo systemctl start rc-local.service

( sudo systemctl daemon-reload )

sudo systemctl status rc-local.service

使能开机自启动:

sudo systemctl enable rc-local.service

解释 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 #服务具体运行命令

#ExecReload #服务重启命令

#ExecStop #服务停止命令

#Restart=always

#RestartSec=3

TimeoutSec=0

RemainAfterExit=yes

GuessMainPID=no

install

WantedBy=multi-user.target

Alias=rc-local.service #服务别名

++++[Unit]++++

· [++++- `Description`:用于设置服务的描述信息。++++](#- Description:用于设置服务的描述信息。)

  • [++++- `Requires`:用于指定服务所依赖的其他服务。++++](#- Requires:用于指定服务所依赖的其他服务。)
  • [++++- `After`:用于指定服务启动的顺序,可以设置在哪些服务之后启动。++++](#- After:用于指定服务启动的顺序,可以设置在哪些服务之后启动。)
  • [++++- `Before`:用于指定服务启动的顺序,可以设置在哪些服务之前启动。++++](#- Before:用于指定服务启动的顺序,可以设置在哪些服务之前启动。)

++++[Service]++++

· - ++++`Type`:定义服务单元的启动类型和运行状态++++

1.simple:默认,这是最简单的服务类型。意思就是说启动的程序就是主体程序,这个程序要是退出那么一切皆休。

[2. forking](#2. forking)::标准 Unix Daemon 使用的启动方式。启动程序后会调用 fork() 函数,把必要的通信频道都设置好之后父进程退出,留下守护进程的子进程。(以 fork 方式从父进程创建子进程,创建后父进程会立即退出)

[3. oneshot](#3. oneshot): systemd中的Type=oneshot服务描述了这一选项适用于只执行一项任务、随后立即退出的服务。可能需要同时设置 RemainAfterExit=yes 使得 systemd 在服务进程退出之后仍然认为服务处于激活状态。

[4. dbus](#4. dbus): 这个程序启动时需要获取一块 DBus 空间,所以需要和 BusName= 一起用。只有它成功获得了 DBus 空间,依赖它的程序才会被启动。

[5. notify](#5. notify):这个程序在启动完成后会通过 sd_notify 发送一个通知消息。所以还需要配合 NotifyAccess 来让 Systemd 接收消息,后者有三个级别:none,所有消息都忽略掉; main,只接受我们程序的主进程发过去的消息; all,我们程序的所有进程发过去的消息都算。NotifyAccess 要是不写的话默认是 main。(当前服务启动完毕,会通知Systemd,再继续往下执行)

[6. idle](#6. idle)

· [++++- `ExecStart`:用于指定服务的启动命令。++++](#- ExecStart:用于指定服务的启动命令。)

ExecStartPre: 启动当前服务之前执行的命令

ExecStartPost:启动当前服务之后执行的命令

ExecReload:重启当前服务时执行的命令

ExecStop:停止当前服务时执行的命令

ExecStopPost:停止当其服务之后执行的命令

RestartSec:自动重启当前服务间隔的秒数

Restart:定义何种情况 Systemd 会自动重启当前服务,可能的值包括always(总是重启)、on-success、on-failure、on-abnormal、on-abort、on-watchdog

no(默认值):退出后不会重启;

always:不管是什么退出原因,总是重启;

on-success:只有正常退出时(退出状态码为0),才会重启;

on-failure:非正常退出时(退出状态码非0),包括被信号终止和超时,才会重启;

on-abnormal:只有被信号终止和超时,才会重启;

on-abort:只有在收到没有捕捉到的信号终止时,才会重启;

on-watchdog:超时退出,才会重启,如ssh服务设置为on-failure,表示任何意外的失败,就将重启sshd。如果sshd正常停止(比如执行systemctl stop命令),它就不会重启。

TimeoutSec:定义 Systemd 停止当前服务之前等待的秒数

RemainAfterExit:值为yes或no,表示进程退出以后,服务仍然保持执行。这样的话,一旦使用systemctl stop命令停止服务,ExecStop指定的命令就会执行。通常和type=oneshot配合使用

· [++++- `WorkingDirectory`:用于指定服务的工作目录。++++](#- WorkingDirectory:用于指定服务的工作目录。)进程工作目录,也就是说在执行前会先切换到这个目录

· [++++- `Environment`:用于设置服务的环境变量。++++](#- Environment:用于设置服务的环境变量。)

· [++++- `User`:用于指定服务运行的用户。++++](#- User:用于指定服务运行的用户。)

· [++++- `Group`:用于指定服务运行的用户组。++++](#- Group:用于指定服务运行的用户组。)

++++[install]++++

· ++++-++++ ++++WantedBy用于指定服务所属的启动级别(target)++++ ++++:++++

poweroff.target:系统关机时的目标单元。

rescue.target:用于系统救援的目标单元,提供了一个最小的功能集合,用于修复系统问题。

multi-user.target:多用户模式的目标单元,用于正常的多用户操作。

graphical.target:图形界面模式的目标单元,用于启动图形界面环境。

reboot.target:系统重启时的目标单元。

[++++- `RequiredBy`:用于指定哪些目标(target)依赖于该服务。++++](#- RequiredBy:用于指定哪些目标(target)依赖于该服务。)

  • Alias:当前 Unit 可用于启动的别名

  • Also:当前 Unit 激活(enable)时,会被同时激活的其他 Unit

更多服务相关知识网络搜索: ubuntu 自启动service

命令

|-----------------------------------------|------------------|
| systemctl start 服务名 | 开启服务 |
| systemctl stop 服务名 | 关闭服务 |
| systemctl status 服务名 | 查看这个服务的状态 |
| systemctl restart 服务名 | 重启服务 |
| systemctl enable 服务名 | 使能开机启动服务 |
| systemctl disable 服务名 | 禁止开机启动服务 |
| systemctl list-units 服务名 | 查看当前服务 |
| systemctl list-units | 查看系统中所有正在运行的服务 |
| systemctl list-units --type=service | 查看所有已启动的服务 |
| systemctl list-unit-files | 查看系统中所有服务的开机启动状态 |
| systemctl list-unit-files 服务名 | 查看当前服务的开机启动状态 |
| systemctl list-dependencies 服务名 | 查看系统中服务的依赖关系 |
| systemctl mask 服务名 | 冻结服务 |
| systemctl unmask 服务名 | 解冻服务 |
| systemctl daemon-reload | 更新服务 |
| systemctl restart 服务名 | 重启服务 |
| systemctl is-enabled 服务名 | 验证是否为开机启动 |
| systemctl set-default multi-user.target | 开机时不启动图形界面 |
| systemctl set-default graphical.target | 开机时启动图形界面 |

systemctl status rc-local.service

服务状态的含义

状态 含义

active(running) 表示程序正在执行

atcive(exited) 执行一次就正常退出的服务,不在系统中执行任何程序

active(waiting) 正在执行中,处于阻塞状态,需要等待其他程序执行完才能执行

inactive (dead) 未启动状态

状态 含义

inactive 服务关闭

disable 服务开机不启动

enabled 服务开机启动

static 服务开机启动项被管理

failed 服务配置错误