linux自启任务详解
linux和windows自启动服务的概念
linux下的自启动任务跟windows服务两者的概念有点不一样;
linux下自启任务只是一个单纯的脚本类型的文本,用该文本描述如何启动一个可执行程序(或可执行的脚本),该文本内的描述语句开机时会根据特定规则得以被执行;因此linux自启服务其实是由两个东西组成:自启任务文件+可执行程序(脚本)
windows服务则是一个对函数入口有特定要求的可执行程序
关于windows的服务有兴趣的可以查看windows服务入门详解,这里不再赘述
linux 服务简介
在Linux系统中,我们经常需要将一些应用程序(或脚本)设置为后台自启服务形式,以便它们可以在系统启动时自动运行,并可以通过系统服务管理工具进行控制。本文将以test_demo.service为例,详细介绍如何在ubuntu 20.04 Linux下创建自定义的systemd服务。
前提条件
- 确保你的Linux系统使用的是systemd作为初始化系统(大多数现代Linux发行版都使用systemd)。
- 确保你有足够的权限来创建和修改系统服务(通常需要root权限)。
一个最简单的服务单元文件
test_demo.service内容如下:
[Unit]
Description=Start up test_demo[Service]
Type=simple
ExecStart=/home/lijilei/xlib_xdnd/test_demo
Restart=on-failure[Install]
WantedBy=multi-user.target
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
关于这个文件有两点注意点:
- 文件的名字最好是你将要执行的可执行文件名字.service
比如我这里将要执行的ExecStart可执行文件为/home/lijilei/xlib_xdnd/test_demo(绝对路径),那我自己创建一个自启service服务单元文件名为test_demo.service;服务单元文件的生效路径为/etc/systemd/system/
路径
cp test_demo.service /etc/systemd/system/
- 确保你service文件中将要执行的文件拥有可执行权限
chmod + x text_demo
服务单元文件内容字段详解
在systemd中,一个单元(Unit)文件定义了如何启动、停止和管理一个服务或进程。单元文件通常有三个主要部分:[Unit]、[Service]和[Install]。下面详细介绍这三个部分的作用和常用指令。
[Unit] 部分
[Unit]部分定义了单元的元数据和依赖关系。它是所有单元文件的首要部分,用于描述单元的属性和它与其他单元之间的关系。
Description:提供单元的简短描述。
Documentation:指定有关该单元的更多文档的链接或文件位置。
Requires:(强依赖)如果这些服务没有被激活,那么当前单元将无法启动。
Wants:(弱依赖)表示当前单元想要这些服务启动,但不是必需的。
BindsTo:如果指定的服务停止了,当前单元也会停止。
After:当前单元只有在列出的其他单元启动后才启动。
Before:当前单元需要在列出的其他单元启动之前启动。
Conflicts:与当前单元冲突的服务,如果这些服务运行,当前单元将不会启动。
Condition…:定义了在哪些条件下单元可以被启动,如果不满足条件,单元将不会被启动。
[Service] 部分
[Service]部分定义了如何启动、运行和管理服务的进程。包含两个强制参数:ExecStart、Type 和其他一些可选参数。 这部分是服务类型单元文件特有的。
Type:定义服务的启动类型,如simple、forking、oneshot、dbus、notify等。
simple:默认类型,启动一个进程并持续运行。
forking:适用于传统的UNIX服务,父进程启动子进程后退出。
oneshot:启动一个进程,该进程执行一次后退出。
dbus:服务通过D-Bus启动。
notify:服务启动后会通知systemd。
ExecStart:启动服务时执行的命令。
ExecStop:停止服务时执行的命令。
ExecReload:重新加载服务时执行的命令。
Restart:定义在何种情况下服务将被重启,如on-failure、always、unless-stopped等。
User:指定以哪个用户身份运行服务。
Group:指定以哪个用户组运行服务。
WorkingDirectory:指定服务的工作目录。
Environment:设置环境变量。
EnvironmentFile:从文件中读取环境变量。
PIDFile:指定PID文件的位置,通常与forking类型一起使用。
PrivateTmp:为服务提供独立的临时目录。
TimeoutStartSec:设置启动服务的超时时间。
KillMode:定义如何杀死服务的进程。
[Install] 部分
[Install]部分定义了如何安装单元文件,即如何使服务在系统启动时自动启动。
WantedBy:指定服务想要加入的目标(Target)。当执行systemctl enable 服务名时,会在/etc/systemd/system/目录下的相应目标单元的.wants子目录中创建一个符号链接到服务的单元文件。
RequiredBy:指定服务必需加入的目标(Target)。与WantedBy类似,但用于更强的依赖关系。
这三个部分共同定义了systemd单元的行为和特性,使得服务管理变得更加灵活和强大。通过正确配置这些部分,你可以确保你的服务按照预期启动、运行和停止。
使用systemctl命令管理自定义Service服务
- 启用服务
启用服务,以便在系统启动时自动启动:
sudo systemctl enable test_demo.service
- 启动服务
手动启动服务进行测试:
sudo systemctl start test_demo.service
- 检查服务状态
检查服务的状态是否在运行:
sudo systemctl status test_demo.service
- 重新加载systemd配置
如果你修改了服务单元文件,需要重新加载systemd的配置:
sudo systemctl daemon-reload
systemctl
systemctl 是 systemd 系统和服务管理器的命令行工具,用于控制systemd系统和服务管理器。以下是systemctl的一些常用命令和选项的详细说明:
服务管理命令
systemctl start test_demo.service:启动指定的服务。
systemctl stop test_demo.service:停止指定的服务。
systemctl restart test_demo.service:重启指定的服务。
systemctl reload test_demo.service:重新加载服务的配置文件,不中断服务。
systemctl status test_demo.service:显示服务的状态。
systemctl enable test_demo.service:在系统启动时启用服务。
systemctl disable test_demo.service:在系统启动时禁用服务。
systemctl reenable test_demo.service:重新启用服务,并修复符号链接。
systemctl preset test_demo.service:检查服务是否已启用,如果没有,则启用它。
systemctl mask test_demo.service:禁用服务,并阻止它被启动。
systemctl unmask test_demo.service:取消屏蔽服务。
systemctl isolate 目标.target:切换到指定的目标(例如,启动到特定的运行级别)。
单元文件管理命令
systemctl list-units:列出所有活动(加载并激活)的单元。
systemctl list-units --type=service:仅列出服务类型的单元。
systemctl list-unit-files:列出所有安装的单元文件。
systemctl is-active test_demo.service:检查服务是否活跃(running 或 active)。
systemctl is-enabled test_demo.service:检查服务是否设置为在启动时启用。
systemctl is-failed test_demo.service:检查服务是否失败。
系统和会话命令
systemctl halt:停止系统并关闭电源。
systemctl poweroff:停止系统并关闭电源。
systemctl reboot:重启系统。
systemctl suspend:将系统置于挂起状态。
systemctl hibernate:将系统置于休眠状态。
systemctl hybrid-sleep:将系统置于混合睡眠状态。
systemctl rescue:进入救援模式。
systemctl emergency:进入紧急模式。
配置和诊断命令
systemctl daemon-reload:重新加载 systemd 配置。
systemctl show test_demo.service:显示服务的属性。
systemctl set-property test_demo.service 属性名称=属性值:动态更改服务的属性。
systemctl edit test_demo.service:编辑服务的 drop-in 单元文件。
systemctl cat test_demo.service:显示服务的完整单元文件,包括 drop-in 文件。
日志和日志管理命令
journalctl:查看和分析 systemd 服务的日志。
journalctl -u test_demo.service:查看指定服务的日志。
journalctl -r:逆序显示查看日志。
journalctl -f:查看实时日志。
journalctl -b:显示当前启动的日志。
journalctl -b -1:显示上一次启动的日志。
journalctl -n 行数:查看日志限制输出行数
journalctl --since “时间”:显示指定时间后的日志。
journalctl --until “时间”:显示指定时间前的日志。eg:journalctl --since “2023-12-31 00:00:00” --until "2023-12-31 23:59:59"显示2023年12月31日全天的日志
journalctl --vacuum-size=500M:设置日志文件的最大大小。
journalctl --vacuum-time=7days:设置日志文件的最长保存时间。
注意事项
确保ExecStart、ExecStop等指令中使用的是绝对路径。
使用systemctl enable和systemctl disable来管理服务的自启动,而不是手动创建启动链接。
使用systemctl is-enabled来检查服务是否设置为自启动。
使用systemctl restart来重启服务,而不是直接杀死进程。
使用journalctl -u test_demo.service来查看服务的日志。
确保服务脚本或应用程序具有适当的错误处理和日志记录。
如果服务需要绑定到特定端口,确保防火墙规则允许该端口的流量。
对于需要频繁重启的服务,考虑使用RestartSec来设置重启间隔。
通过以上步骤,可以在Linux系统中创建和管理自定义的systemd服务。这为自动化和系统级别的管理提供了强大的工具。
转载来自:https://blog.csdn.net/qq_37059136/article/details/143914519