Linux添加自定义系统服务,开机自启
一、systemctl方式
由于chkconfig是Redhat发行版特有的服务配置方式,在基于debian的发行版下原生不支持,因此使用systemctl方式添加自定义系统服务,更具优势。
systemctl脚本存放在:/usr/lib/systemd/,有系统(system)和用户(user)之分,需要开机不登陆就能运行的程序,存在系统服务里,即:/usr/lib/systemd/system目录下。
systemctl管理的每一个服务以.service结尾,一般会分为3部分:[Unit]、[Service]和[Install]。
[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]
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:指定环境变量
注意:[Service]部分的启动、重启、停止命令全部要求使用绝对路径,使用相对路径则会报错!
[Install]
用来定义如何启动,以及是否开机启动:
WantedBy:它的值是一个或多个 Target,当前 Unit 激活时(enable)符号链接会放入/etc/systemd/system目录下面以 Target 名 + .wants后缀构成的子目录中
RequiredBy:它的值是一个或多个 Target,当前 Unit 激活时,符号链接会放入/etc/systemd/system目录下面以 Target 名 + .required后缀构成的子目录中
Alias:当前 Unit 可用于启动的别名
Also:当前 Unit 激活(enable)时,会被同时激活的其他 Unit
范例:
1 [Unit]
2 Description=typeset
3
4 [Service]
5 #Type=forking
6 WorkingDirectory=/opt/typeset
7 PrivateTmp=true
8 ExecStart=/opt/typeset/start.sh
9 ExecStop=/opt/typeset/stop.sh
10 ExecReload=/opt/typeset/restart.sh
11
12 [Install]
13 WantedBy=multi-user.target
脚本授权:chmod 755 /usr/lib/systemd/system/myservice.service
开机启动:systemctl enable myservice.service
至此,每次开机都会执行/opt/myservice/start.sh,每次关机都会执行/opt/myservice/stop.sh。
二、chkconfig方式
一般比较老的centos支持chkconfig,其添加步骤比较简单:
1、在/etc/init.d/目录下新建一个自定义服务的文件如:myservice.sh
2、添加下面两句到 #!/bin/bash 之后。
1 # chkconfig: 2345 10 90
2 # description: myservice
PS:不添加这两行会报错:执行chkconfig --add myservice后提示:service myservice does not support chkconfig
PS:其中2345是默认启动级别,级别有0-6共7个级别
等级0表示:表示关机
等级1表示:单用户模式
等级2表示:无网络连接的多用户命令行模式
等级3表示:有网络连接的多用户命令行模式
等级4表示:不可用
等级5表示:带图形界面的多用户模式
等级6表示:重新启动
10是启动优先级,90是停止优先级,优先级范围是0-100,数字越大,优先级越低。
3、命令
开启开机自启动服务:chkconfig myservice on
添加开机自启动服务:chkconfig --add myservice
查看开机自启动服务:chkconfig --list myservice
三、chkconfig与systemctl命令对照表
PS:此表仅为命令对照,在chkconfig下配置的服务,是不能使用systemctl运行的!当然如果同时安装配置了两种方式的服务,肯定是都能用的。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· AI 智能体引爆开源社区「GitHub 热点速览」
· 从HTTP原因短语缺失研究HTTP/2和HTTP/3的设计差异
· 三行代码完成国际化适配,妙~啊~
2020-09-10 图的深度优先搜索和广度优先搜索
2020-09-10 并查集
2019-09-10 SimpleDateFormat线程不安全