Linux之service服务-实现程序脚本开机自启

Posted xiaohai@Linux

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Linux之service服务-实现程序脚本开机自启相关的知识,希望对你有一定的参考价值。

一、什么是.service文件?

        Linux中.service文件是某项服务对应的配置文件,可用于systemd管理和控制的服务的设置。

        .service 文件通常包含3个模块:

[Unit]     控制单元,表示启动顺序和依赖关系。

[Service]  服务,表示服务的定义。

[Install]  安装,表示如何安装配置文件。

        注:service配置文件字段详解见尾部的 附录

        例如:Todesk开机自启服务

[Unit]
Description=ToDesk Daemon Service (服务描述)
After=network-online.target (服务依赖,再这些服务后启动本服务)
Before=nss-lookup.target (服务依赖,再这些服务前启动本服务)
Wants=network-online.target nss-lookup.target (与当前服务配合的其他服务,如果它们没有运行,当前服务不会启动失败)

[Service]
Type=simple (默认值,systemd认为该服务将立即启动)
ExecStart=/opt/todesk/bin/ToDesk_Service (启动当前服务的命令)
ExecStop=/bin/kill -SIGINT $MAINPID (停止当前服务时执行的命令)
Restart=on-failure (定义何种情况 Systemd 会自动重启当前服务,当前是仅在服务进程异常退出时重启)
RestartSec=3s (自动重启当前服务间隔的秒数)
User=root (设置进程在执行时使用的用户,当前是root)

[Install]
WantedBy=multi-user.target (表示该服务所在的服务组,当前是服务所在的服务组是multi-user.target)

二、如何管理.service文件?(实现脚本或者程序开机自启)

1.service存放位置

        .service 文件配置的服务常用systemd管理,然而,systemd有系统和用户区分:

        系统(/user/lib/systemd/system/)  ARM的可能是/usr/lib/systemd/system

        用户(/etc/lib/systemd/)

        一般系统管理员手工创建的单元文件建议存放在/etc/systemd/system/目录下面。我们的todeskd.service是放在/etc/systemd/system/下的。

2.设置服务开机自启

        将.service文件放到/etc/systemd/system/后,使用systemctl enable todeskd.service命令用于设置开机自启服务,原理其实就是在上面两个目录之间,建立符号链接关系。即会在/etc/systemd/system/multi-user.target.wants/的目录下新建一个/usr/lib/systemd/system/todeskd.service文件的链接。

3.启动服务

        使用systemctl start todeskd.service命令,启动todesk服务,此时可以查看ToDesk_Service有没有在后台运行:ps -aux | grep ToDesk_Service

        如果程序正常在后台启动了,那么你就可以重启系统检验一下程序有没有开机自启!

三、service服务相关操作指令

1.修改配置文件后重启

# 重新加载配置文件

sudo systemctl daemon-reload

 重启相关服务

sudo systemctl restart 服务名

2.服务管理

systemctl start 服务名            开启服务

systemctl stop 服务名            关闭服务

systemctl status 服务名     显示状态

systemctl restart 服务名     重启服务

systemctl enable 服务名     开机启动服务

systemctl disable 服务名     禁止开机启动

systemctl daemon-reload 修改服务配置文件后需要重新加载服务

systemctl is-enabled 服务名 查询是否自启动服务

systemctl list-units              查看系统中所有正在运行的服务

systemctl list-unit-files      查看系统中所有服务的开机启动状态

systemctl list-dependencies 服务名        查看系统中服务的依赖关系

systemctl mask 服务名               冻结服务

systemctl unmask 服务名           解冻服务

systemctl set-default multi-user.target     开机时不启动图形界面

systemctl set-default graphical.target      开机时启动图形界面

 systemctl is-active 服务名  显示某个 Unit 是否正在运行

systemctl is-failed 服务名  显示某个 Unit 是否处于启动失败状态

systemctl is-enabled 服务名  显示某个 Unit 服务是否建立了启动链接

systemd-analyze blame  查看每个服务的启动耗时

systemctl list-units  查看当前运行的所有服务

查看服务是否开机启动

systemctl list-unit-files

每个配置文件的状态,一共有四种。

  • enabled:已建立启动链接;表示允许开机启动
  • disabled:没建立启动链接;表示禁止开机启动
  • static:该配置文件没有[Install]部分(无法执行),只能作为其他配置文件的依赖
  • masked:该配置文件被禁止建立启动链接

显示service服务的状态

systemctl status  todeskd.service

  • Loaded行:配置文件的位置,是否设为开机启动
  • Active行:表示正在运行
  • Main PID行:主进程ID
  • Status行:由应用本身(这里是 httpd )提供的软件当前状态
  • CGroup块:应用的所有子进程
  • 日志块:应用的日志

Active行:

active(running) 表示程序正在执行;
atcive(exited) 执行一次就正常退出的服务,不在系统中执行任何程序;
active(waiting) 正在执行中,处于阻塞状态,需要等待其他程序执行完才能执行;
inactive (dead) 未启动状态;

附录:

service配置文件字段详解

[Unit]区块通常是配置文件的第一个区块,用来定义 Unit 的元数据,以及配置与其他 Unit 的关系。它的主要字段如下。

Description:简短描述

Documentation:文档地址

Requires:当前 Unit 依赖的其他 Unit,如果它们没有运行,当前 Unit 会启动失败

Wants:与当前 Unit 配合的其他 Unit,如果它们没有运行,当前 Unit 不会启动失败

BindsTo:与Requires类似,它指定的 Unit 如果退出,会导致当前 Unit 停止运行

Before:如果该字段指定的 Unit 也要启动,那么必须在当前 Unit 之后启动

After:如果该字段指定的 Unit 也要启动,那么必须在当前 Unit 之前启动

Conflicts:这里指定的 Unit 不能与当前 Unit 同时运行

Condition...:当前 Unit 运行必须满足的条件,否则不会运行

Assert...:当前 Unit 运行必须满足的条件,否则会报启动失败

[Service]区块用来 Service 的配置,只有 Service 类型的 Unit 才有这个区块。它的主要字段如下。

Type:定义启动时的进程行为。它有以下几种值。

Type=simple:默认值,执行ExecStart指定的命令,启动主进程

Type=forking:以 fork 方式从父进程创建子进程,创建后父进程会立即退出

Type=oneshot:一次性进程,Systemd 会等当前服务退出,再继续往下执行

Type=dbus:当前服务通过D-Bus启动

Type=notify:当前服务启动完毕,会通知Systemd,再继续往下执行

Type=idle:若有其他任务执行完毕,当前服务才会运行

ExecStart:启动当前服务的命令

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

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

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

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

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

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

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

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

Environment:指定环境变量

[Install]通常是配置文件的最后一个区块,用来定义如何启动,以及是否开机启动。它的主要字段如下。

WantedBy:它的值是一个或多个 Target,当前 Unit 激活时(enable)符号链接会放入/etc/systemd/system目录下面以 Target 名 + .wants后缀构成的子目录中

RequiredBy:它的值是一个或多个 Target,当前 Unit 激活时,符号链接会放入/etc/systemd/system目录下面以 Target 名 + .required后缀构成的子目录中

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

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

[参考链接]

https://blog.csdn.net/w2009211777/article/details/125489179

https://blog.csdn.net/weixin_33768481/article/details/89770056
https://blog.csdn.net/a913909626/article/details/118405378
https://www.cnblogs.com/q149072205/p/11541693.html

https://blog.csdn.net/liuchonghua/article/details/81743606

https://www.cnblogs.com/zwcry/p/9602756.html

https://www.ruanyifeng.com/blog/2016/03/systemd-tutorial-commands.html

https://www.ruanyifeng.com/blog/2016/03/systemd-tutorial-part-two.html


感谢!

以上是关于Linux之service服务-实现程序脚本开机自启的主要内容,如果未能解决你的问题,请参考以下文章

Fedora设置开机自启动脚本rc-local.service服务

Fedora设置开机自启动脚本rc-local.service服务

Linux 之centos7 制作服务自启动systemd

ubuntu自定义一个service制作开机自启脚本,nacos开机自启

ubuntu 设置脚本开机自启动

Linux 使用systemd service 实现开机自启动