本文最后更新于 2023-09-02,文章内容可能已经过时,请注意文章发布时间.

Linux系统-开机自动执行的脚本配置

systemd service简介

**官腔:**一种以 .service 结尾的单元(unit)配置文件,用于控制由 systemd 控制或监视的进程。简单说,用于后台以守护精灵(daemon)的形式运行程序。

**实际上:**在Linux操作系统上以服务注册到系统的脚本配置,我将其理解为类似于Windows上的服务进程。可以被systemctl管理的一类服务进程。而其启动动作和其他信息都保存在它的配置文件中,即.service文件。

基本结构

[Unit]:控制单元的定义,可以定义该服务的描述,需求模块等

[Service]:定义服务主体的动作,工作目录等。

[Install]:安装定义。

基本语法

与yaml配置文件的语法类似:onyestrue1表示开启,offnofalse0表示关闭。

上述规则不适用于嵌入的shell语句。

QuickStart

定义控制单元

[Unit]
Description=这里是服务的描述,不需要定义名称。
Wants=表明本服务需要依靠某某服务才能运行。但是被依赖服务未启动也不影响本服务的启动。
require=本服务依赖的服务,被依赖服务未启动,则本服务不启动。
Before=本服务要在某服务启动之前启动。
After=本服务在某服务启动之后启动。

定义服务本体

[Service]
Type=服务类型

常用服务类型:

  • simple:默认,跑完就退。
  • forking:启动程序后会调用 fork() 函数,把必要的通信频道都设置好之后父进程退出,留下守护精灵的子进程。人走魂还在。
  • oneshot:启动之后关闭进程,但在你关闭服务之前,它的状态仍然是running
  • dbus:这个程序启动时需要获取一块 DBus 空间,所以需要和 BusName= 一起用。只有它成功获得了 DBus 空间,依赖它的程序才会被启动。
  • notify :嘿嘿,没学会。
  • idle :服务中的其他调用全部完成之后在执行服务本身。

举个例子:

[Service]
Type=oneshot#设置服务类型是oneshot
RemainAfterExit=yes#表示即便进程退出也视作运行中
Restart=yes#退出自动重启
WrokingDirectory=/A/path#设置工作路径,否则会找不到文件
ExecStart=./app start my service #写入启动脚本,表示服务启动要执行的命令,换行要加"\"
ExecStop=./app stop my service #退出脚本,同上

安装

这里的安装其实指的是这个服务会被谁使用,而不是没人要的。目标单位(target units)是 systemd 中的一种特殊单位,代表系统在不同运行级别或状态下的目标。例如,multi-user.target 表示多用户模式,graphical.target 表示图形界面模式。

举例:

[Install]
WantedBy=multi-user.target #表示系统进入多用户模式时启动服务
Alias=example#服务别名,systemctl可以通过这个别名访问到这个服务。

启动停止与开机自启动

确认编写无误后,将写好的配置文件命名为<服务名>.service,并复制到/etc/systemd/system/目录下。然后就可以将程序作为服务启动了:

systemctl start <servicename>.service#启动服务
systemctl stop <servicename>.service#停止服务
systemctl status <servicename>.service#查看运行状态
systemctl enable <servicename>.service#启动开机自启
systemctl disable <servicename>.service#关闭开机自启

完整示例

[Unit]
Description=Restart my blog while reboot
Requires=network.target
After=network.target

[Service]
ExecStart=./ docker compose ud -d
WorkingDirectory=/apps/blog/
User=root
Type=simple
Restart=always

[Install]
WantedBy=default.target