千家信息网

在Linux系统中怎么创建和修改systemd单元文件

发表于:2025-12-02 作者:千家信息网编辑
千家信息网最后更新 2025年12月02日,本篇内容介绍了"在Linux系统中怎么创建和修改systemd单元文件"的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读
千家信息网最后更新 2025年12月02日在Linux系统中怎么创建和修改systemd单元文件

本篇内容介绍了"在Linux系统中怎么创建和修改systemd单元文件"的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!

(1)单元文件概述


单元文件包含单元的指令和行为信息。在后台systemctl命令和单元文件一起工作。为了出色而正确的完成工作,系统管理员必须能够手工编辑单元文件。一般系统管理员手工创建的单元文件建议存放在/etc/systemd/system/目录下面。
单元配置文件的格式是:

代码如下:


unit_name.type_extension

这里的unit_name代表单元名称,type_extension代表单元类型。
单元文件可以作为附加的文件放置到一个目录下面,比如为了定制sshd.service服务,可以创建sshd.service.d/custom.conf文件,在文件中做一些自定义的配置。
同样的,可以创建sshd.service.wants/和sshd.service.requires/目录。这些目录包含sshd服务关联服务的软连接,在系统安装的时候,这些软连接或自动创建,也可以手工创建软连接。
许多单元配置文件可以使用单元说明符--通配的字符串,可以在单元文件被引导的时候动态的被变量替换。这使创建一些通用的单元配置模版成为可能。


(2)理解单元文件结构


典型的单元文件包含三节:
[Unit]节,包含不依赖单元类型的一般选项,这些选型提供单元描述,知道单元行为,配置单元和其他单元的依赖性。
[unittype]节,如果单元有特定的类型指令,在unittype节这些指令被组织在一起。举个例子,服务单元文件包含[Service]节,里面有经常使用的服务配置。
[Install]节,包含systemctlenable或者disable的命令安装信息。
1)[Unit]节选项
Description单元描述信息,这些文字信息在systemclstatus命令是会输出。
Documentation单元文档信息的URLs。
After定义在那些单元之后启动,本单元只在制定的单元启动之后启动,不像Requires选项,After选项不明确激活特定的单元,Before选项则是有相反的功能。
Requires配置单元的依赖性,在Requires选项中的单元需要一起被激活,如果有一个单元启动失败,其他单元都不会被启动。
Wants比Requires选项依赖性要弱很多,如果列表之中的的单元启动失败,不会对其他单元造成影响,这是推荐的建立自定义单元依赖性的方式。
Conflicts定义单元冲突关系,和Requires相反。
2)[unittype]类型是[Service]时的选项
Type配置单元进程在启动时候的类型,影响执行和关联选项的功能,可选的关键字是:
simple默认值,进程和服务的主进程一起启动;
forking进程作为服务主进程的一个子进程启动,父进程在完全启动之后退出。
oneshot同simple相似,但是进程在启动单元之后随之退出。
dbus同simple相似,但是随着单元启动后只有主进程得到D-BUS名字。
notify同simple相似,但是随着单元启动之后,一个主要信息被sd_notify()函数送出。
idle同simple相似,实际执行进程的二进制程序会被延缓直到所有的单元的任务完成,主要是避免服务状态和shell混合输出。
ExecStart指定启动单元的命令或者脚本,ExecStartPre和ExecStartPost节指定在ExecStart之前或者之后用户自定义执行的脚本。Type=oneshot允许指定多个希望顺序执行的用户自定义命令。
ExecStop指定单元停止时执行的命令或者脚本。
ExecReload指定单元重新加载是执行的命令或者脚本。
Restart这个选项如果被允许,服务重启的时候进程会退出,会通过systemctl命令执行清除并重启的操作。
RemainAfterExit如果设置这个选择为真,服务会被认为是在激活状态,即使所以的进程已经退出,默认的值为假,这个选项只有在Type=oneshot时需要被配置。
3)[Install]节选项
Alias为单元提供一个空间分离的附加名字。
RequiredBy单元被允许运行需要的一系列依赖单元,RequiredBy列表从Require获得依赖信息。
WantBy单元被允许运行需要的弱依赖性单元,Wantby从Want列表获得依赖信息。
Also指出和单元一起安装或者被协助的单元。
DefaultInstance实例单元的限制,这个选项指定如果单元被允许运行默认的实例。
4)一个postfix服务的例子:
单元文件位于/usr/lib/systemd/system/postifix.service,内容如下:

代码如下:


[Unit]
Description=PostfixMailTransportAgent
After=syslog.targetnetwork.target
Conflicts=sendmail.serviceexim.service
[Service]
Type=forking
PIDFile=/var/spool/postfix/pid/master.pid
EnvironmentFile=-/etc/sysconfig/network
ExecStartPre=-/usr/libexec/postfix/aliasesdb
ExecStartPre=-/usr/libexec/postfix/chroot-update
ExecStart=/usr/sbin/postfixstart
ExecReload=/usr/sbin/postfixreload
ExecStop=/usr/sbin/postfixstop
[Install]
WantedBy=multi-user.target

(3)创建自定义的单元文件


以下几种场景需要自定义单元文件:
希望自己创建守护进程;
为现有的服务创建第二个实例;
引入SysV init脚本。
另外一方面,有时候需要修改已有的单元文件。
下面介绍创建单元文件的步骤:
1)准备自定义服务的执行文件。
可执行文件可以是脚本,也可以是软件提供者的的程序,如果需要,为自定义服务的主进程准备一个PID文件,一保证PID保持不变。另外还可能需要的配置环境变量的脚本,确保所以脚本都有可执行属性并且不需要交互。
2)在/etc/systemd/system/目录创建单元文件,并且保证只能被root用户编辑:

代码如下:


touch/etc/systemd/system/name.servicechmod664/etc/systemd/system/name.service

文件不需要执行权限。
3)打开name.service文件,添加服务配置,各种变量如何配置视所添加的服务类型而定,下面是一个依赖网络服务的配置例子:

代码如下:


[Unit]
Description=service_description
After=network.target
[Service]
ExecStart=path_to_executable
Type=forking
PIDFile=path_to_pidfile
[Install]
WantedBy=default.target

4)通知systemd有个新服务添加:

代码如下:


systemctldaemon-reload
systemctlstartname.service

(4)创建emacs.service例子:


1)创建文件,并确保正确权限:

代码如下:


~]#touch/etc/systemd/system/emacs.service
~]#chmod664/etc/systemd/system/emacs.service

2)添加配置信息:

代码如下:


[Unit]
Description=Emacs:theextensible,self-documentingtexteditor
[Service]
Type=forking
ExecStart=/usr/bin/emacs--daemon
ExecStop=/usr/bin/emacsclient--eval"(kill-emacs)"
Environment=SSH_AUTH_SOCK=%t/keyring/ssh
Restart=always
[Install]
WantedBy=default.target

3)通知systemd并开启服务:

代码如下:


~]#systemctldaemon-reload
~]#systemctlstartemacs.service

(5)创建第二个sshd服务的例子


1)拷贝sshd_config文件


代码如下:

]#cp/etc/ssh/sshd{,-second}_config

2)编辑sshd-second_config文件,添加22220的端口,和PID文件:


代码如下:

Port22220
PidFile/var/run/sshd-second.pid

如果还需要修改其他参数,请阅读帮助。
3)拷贝单元文件:


代码如下:

~]#cp/usr/lib/systemd/system/sshd{,-second}.service

4)编辑单元文件sshd-second.service
修改描述字段

代码如下:

Description=OpenSSHserversecondinstancedaemon


添加sshd.service服务在After关键字之后:

代码如下:

After=syslog.targetnetwork.targetauditd.servicesshd.service


移除sshdkey创建:

代码如下:

ExecStartPre=/usr/sbin/sshd-keygen

移除这一行
在执行脚本里,添加第二sshd服务的配置文件:

代码如下:

ExecStart=/usr/sbin/sshd-D-f/etc/ssh/sshd-second_config$OPTIONS


修改后的sshd-second.service文件内容如下:

代码如下:


[Unit]
Description=OpenSSHserversecondinstancedaemon
After=syslog.target network.targe tauditd.service sshd.service
[Service]
EnvironmentFile=/etc/sysconfig/sshd
ExecStart=/usr/sbin/sshd -D -f /etc/ssh/sshd-second_config$OPTIONS
ExecReload=/bin/kill -HUP $MAINPID
KillMode=process
Restart=on-failure
RestartSec=42s
[Install]
WantedBy=multi-user.target

5)如果使用SELinux,添加tcp端口,负责第二sshd服务的端口就会被拒绝绑定:


代码如下:

~]#semanage port -a -tssh_port_t -p tcp22220

6)设置开机启动并测试:

代码如下:


~]#systemctl enable sshd-second.service
~]$ssh -p 22220 user@server

确保防火墙端口也开放。


(6)修改已经存在的单元文件


systemd单元配置文件默认保存在/usr/lib/systemd/system/目录,系统管理员不建议直接修改这个目录下的文件,自定义的文件在/etc/systemd/system/目录下,如果有扩展的需求,可以使用以下方案:
创建一个目录/etc/systemd/system/unit.d/,这个是最推荐的一种方式,可以参考初始的单元文件,通过附件配置文件来扩展默认的配置,对默认单元文件的升级会被自动升级和应用。
从/usr/lib/systemd/system/拷贝一份原始配置文件到/etc/systemd/system/,然后修改。复制的版本会覆盖原始配置,这种方式不能增加附件的配置包,用于不需要附加功能的场景。
如果需要恢复到默认的配置文件,只需要删除/etc/systemd/system/下的配置文件就可以了,不需要重启机器,使用如下命令应用改变就可以:

代码如下:


systemctl daemon-reload

daemon-reload选项重新加载所以单元文件并重新创建依赖书,在需要立即应用单元文件改变的时候使用。另外,也可以使用下面的命令达到同样的目的:

代码如下:


init q

还有,如果修改的是一个正在运行服务的单元文件,服务需要被重启下:

代码如下:

systemct lrestart name.service

(7)扩展默认单元配置文件配置


为了扩展默认的单元文件配置,需要先在/etc/systemd/system/下创建一个目录,用root执行类似下面的命令:

代码如下:


mkdir/etc/systemd/system/name.service.d

在刚才创建的目录之下创建配置文件,必须以.conf文件结尾。
例如创建一个自定义的依赖文件,内容如下:

代码如下:


[Unit]
Requires=new_dependency
After=new_dependency

另外一个例子,可以配置重启的时候,在主进程退出后30秒在重启,配置例子如下:

代码如下:


[Service]
Restart=always
RestartSec=30

推荐每次只产生一个小文件,每个文件只聚焦完善一个功能,这样配置文件很容易被移除或者链接到其他服务对的配置目录中。
为了应用刚才的修改,使用root执行以下操作:

代码如下:


systemctldaemon-reload
systemctlrestartname.service

例子:扩展httpd.service服务配置
为了是httpd服务启动的时候执行用户自定义的脚本,需要修改httpd的单元配置文件,执行以下几步操作,首先创建一个自定义文件的目录及自定义文件:

代码如下:


~]#mkdir/etc/systemd/system/httpd.service.d
~]#touch/etc/systemd/system/httpd.service.d/custom_script.conf

假设自定义文件位置在/usr/local/bin/custom.sh,将这个信息添加到custom_script.conf自定义脚本中:

代码如下:


[Service]
ExecStartPost=/usr/local/bin/custom.sh

应用更改:

代码如下:


~]#systemctldaemon-reload
~]#systemctlrestarthttpd.service


"在Linux系统中怎么创建和修改systemd单元文件"的内容就介绍到这里了,感谢大家的阅读。如果想了解更多行业相关的知识可以关注网站,小编将为大家输出更多高质量的实用文章!

单元 文件 配置 代码 服务 进程 目录 命令 脚本 信息 例子 时候 系统 类型 依赖性 内容 应用 相似 功能 用户 数据库的安全要保护哪些东西 数据库安全各自的含义是什么 生产安全数据库录入 数据库的安全性及管理 数据库安全策略包含哪些 海淀数据库安全审计系统 建立农村房屋安全信息数据库 易用的数据库客户端支持安全管理 连接数据库失败ssl安全错误 数据库的锁怎样保障安全 网吧服务器需要ecc 广东专业软件开发收费报价表 长宁区数据软件开发诚信服务 大数据库思维方式是什么 关于网络安全的知识要点 崇明区营销网络技术服务参考价格 intel服务器cpu天梯图 hp刀箱管理服务器地址 服务器系统启动界面 raid多盘服务器 为何有网络还提示无法连接服务器 数据库怎么求日期天数只差 海康威视涉及网络安全吗 我的世界服务器制作小游戏 实验五数据库完整性约束 厦门易佳缘网络技术有限公司 厦门网络安全技能竞赛 韩国网络安全发展 太仓中高端服务器厂家直销价格 主机访问服务器作用 华为服务器 开机画面 计算机网络技术学学物理吗 智能交通和软件开发相连吗 数据库图像模糊 常用网络安全命令心得体会 日本服务器地址vpn 深圳视频安防软件开发服务 软件开发属于一套吗 计算机网络技术对比物联网 数据库安全性的概念
0