Systemd: Service File Examples
大多数Linux发行版使用 systemd作为系统服务管理工具。
systemctl
是systemd的主要命令,用于管理控制服务。
这篇文章中将介绍如何创建允许你使用systemctl
命令的sysytemd服务文件,如何无需reboot来重启systemd并reload unit文件,如何enable 一个新的服务。
并举例介绍大多数重要的systemd服务文件选项。
创建 systemd service 文件
创建systemd service file /etc/systemd/system/name.service
(name
是示例名称,根据你自己的服务名称自行替换)
准备使用自定义服务可执行文件。这可以是自定义创建的脚本,也可以是软件提供商提供的可执行文件。如果需要,准备一个PID文件以保存自定义服务主进程的常量PID。还可以包含环境文件来存储服务的shell变量。确保源脚本是可执行的(通过执行)而不是交互式的。
touch /etc/systemd/system/name.service
chmod 664 /etc/systemd/system/name.service
打开该文件,添加systemd最小服务配置选项:
[Unit]
Description=service_description
After=network.target
[Service]
ExecStart=path_to_executable
Type=forking
PIDFile=path_to_pidfile
[Install]
WantedBy=default.target
其中:
- service_description 是一个信息性描述,显示在日志日志文件和
systemctl status
命令的输出中。 - 该设置确保仅在网络运行后启动服务。添加以空格分隔的其他相关服务或目标列表
After
- path_to_executable 代表实际服务可执行文件的路径
Type=forking
用于进行fork系统调用的守护进程。使用 path_to_pidfile 中指定的PID创建服务的主进程。查找其他启动类型
service 文件发生变更,systemd配置需要重新加载:
$ sudo systemctl daemon-reload
现在,应可以使用 start
, stop
, restart
和 status
:
$ sudo systemctl start name
$ sudo systemctl stop name
$ sudo systemctl restart name
$ systemctl status name
在系统启动时自动配置服务,使用 enable
:
$ sudo systemctl enable name
检查 service 日志:
$ journalctl -u name
Systemd Service File Options 选项
Systemd service files通常含有三个区域。
通用配置项在一般在[Unit]
和 [Install]
配置
特定于服务的配置选项在 [Service]
中进行配置
Important Section Options[Unit]
Option | Description |
---|---|
Description |
unit的简短描述 |
Documentation |
参考文档URI列表 |
Before , After |
units 的启动顺序 |
Requires |
如果激活此unit,则此处列出的units也将被激活。如果其他units中的一个停用或发生故障,则此unit将被停用。 |
Wants |
配置较Requires 弱的依赖性。如果列出的任何unit未成功启动,则对此unit激活没有影响。这是建立自定义unit依赖关系的推荐方法。 |
Conflicts |
如果一个 unit 已经在其他unit上设置,那么启动前者将停止后者,反之亦然。 |
表1:Unit Option
> 在大多数情况下,仅使用`After`和`Before` unit 文件选项设置排序依赖关系就足够了。 如果还使用 `Wants`(推荐)或`Requires`设置需求依赖关系,则仍需要指定排序依赖关系。 这是因为排序和需求依赖性彼此独立地工作。
使用 man 查看[Unit]
查看完整的选项:
$ man systemd.unit
Important Section Options[Install]
Option | Description |
---|---|
Alias |
空格分隔的 unit 附加名称列表。大多数命令(不包括systemctl systemctl enable )可以使用别名而不是实际的 unit 名称 |
RequiredBy , WantedBy |
当列出的服务被启动,此服务也会被启动。 参考Wants Requires [Unit] |
Also |
指定用户运行systemctl enable systemctl disable 时要与此 unit 一起启用或禁用的 unit 列表 |
使用 man 查看[Install]
查看完整的选项:
$ man systemd.unit
Important Section Options[Service]
Option | Description |
---|---|
Type |
配置影响ExecStart 功能和相关选项的 unit 进程启动类型。+ simple - 默认值。从ExecStart开始的进程是服务的主要进程+ forking - 从ExecStart开始的进程产生了一个子进程,该进程成为该服务的主要进程。启动完成后,父进程退出。+ oneshot - 类似于simple , 但进程在启动后续units 之前会退出+ dbus - 类似于simple ,但只有在主进程获得D-Bus名称后才启动后续unit+ notify - 类似于simple ,但只有在通过 sd_notify() 函数发送通知消息后才会启动后续unit+ idle - 类似于simple ,服务二进制文件的实际执行被延迟,直到所有作业完成,这避免了将状态输出与服务的shell输出混合。 |
ExecStart |
指定启动设备时要执行的命令或脚本。ExecStartPre 和ExecStartPost 指定要在ExecStart 之前和之后执行的自定义命令。Type=oneshot 可以指定多个自定义命令,然后按顺序执行。 |
ExecStop |
指定 unit 停止时要执行的命令或脚本。 |
ExecReload |
指定重新加载 unit 时要执行的命令或脚本 |
Restart |
启用此选项后,服务将在其进程退出后重新启动,但systemctl命令将执行干净停止( clean stop ) |
RemainAfterExit |
如果设置为True,即使退出所有进程,该服务也会被视为活动状态。默认值为False。如果配置了Type=oneshot ,则此选项特别有用 |
使用 man 查看[Service]
查看完整的选项:
$ man systemd.service
postfix.service Unit File 例子
下面是 postfix 包的 systemd 服务文件(/usr/lib/systemd/system/postfix.service redhat OS):
[Unit]
Description=Postfix Mail Transport Agent
After=syslog.target network.target
Conflicts=sendmail.service exim.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/postfix start
ExecReload=/usr/sbin/postfix reload
ExecStop=/usr/sbin/postfix stop
[Install]
WantedBy=multi-user.target
更多信息,参考 arch 文档:systemd
Systemd: Service File Examples的更多相关文章
- .NET Worker Service 部署到 Linux 作为 Systemd Service 运行
上一篇文章我们了解了如何将.NET Worker Service 作为 Windows 服务运行,今天我接着介绍一下如何将 Worker Service 部署到 Linux 上,并作为 Systemd ...
- systemd service
Man page systemd.unit SYSTEMD.UNIT(5) systemd.unit SYSTEMD.UNIT(5) NAME systemd.unit - Unit configur ...
- CENTOS/RHEL 7 系统中设置SYSTEMD SERVICE的ULIMIT资源限制
遇到的问题: golang程序一直出现 too many open files的报错, 尽管对 /etc/security/limits.conf 做了设置, 对最大文件打开数,最大进程数做了调优. ...
- 【转】CENTOS/RHEL 7 系统中设置SYSTEMD SERVICE的ULIMIT资源限制
在bash中,有个ulimit命令,提供了对shell及该shell启动的进程的可用资源控制.主要包括打开文件描述符数量.用户的最大进程数量.coredump文件的大小等. 在centos 5/6 等 ...
- systemd.service 中文手册
版权声明 本文译者是一位开源理念的坚定支持者,所以本文虽然不是软件,但是遵照开源的精神发布. 无担保:本文译者不保证译文内容准确无误,亦不承担任何由于使用此文档所导致的损失. 自由使用:任何人都可以自 ...
- Linux Simple Systemd Service Guide
Simple Systemd Service Guide 主题 Systemd介绍 Systemd基本操作 怎样编写_service_.service文件 怎样部署service Systemd介绍 ...
- systemd service 设置limit,不生效问题
参考博文: http://smilejay.com/2016/06/centos-7-systemd-conf-limits/(解决方法参考此博文) 问题简述:Centos7下修改系统的最大文件打 ...
- 如何编写一个Systemd Service(转)
转自 https://segmentfault.com/a/1190000014740871 0x01 什么是Systemd Service Systemd 服务是一种以 .service 结尾的单元 ...
- Ubuntu18.04初始的systemd service
Ubuntu18.04初始的systemd service 两个位置 /etc/systemd/system root@dev2:~# ls /etc/systemd/system aliyun.se ...
随机推荐
- 【leetcode】509. Fibonacci Number
problem 509. Fibonacci Number solution1: 递归调用 class Solution { public: int fib(int N) { ) return N; ...
- kdd cup 2019
比赛简介: 任务1:推荐最佳交通方式 任务描述:给定用户的一些信息,预测用户使用何种最佳交通方式由O(起点)到D(终点) 数据描述: profiles.csv: 属性pid:用户的ID: 属性p0~p ...
- 10-3 LVM(逻辑卷管理器)
LVM(逻辑卷管理器) 允许对卷进行方便操作的抽象层,包括重新设定文件系统的大小 允许在多个物理设备间重新组织文件系统 将设备指定为物理卷 用一个或者多个物理卷来创建一个卷组 物理卷是用固定大小的物理 ...
- ffmpeg学习笔记-编译脚本
之前已经用他人的编译脚本对ffmpeg进行了成功编译,那么在裁剪ffmpeg的时候需要指定文件,这时候应该怎么编写编译脚本呢?本文目的在于说明ffmpeg编译脚本的编写 首先在ffmpeg的目录下新建 ...
- centOS 安装 npm
下载 cd /usr/local/node wget https://npm.taobao.org/mirrors/node/v10.14.1/node-v10.14.1-linux-x64.tar. ...
- 修改Ubuntu屏幕的分辨率
最近重新装了一下环境,用vnc连接服务器,发现分辨率过低,于是查了一下如何修改分辨率,将其调高. 编辑/etc/default/grub 搜索"#GRUB_GFXMODE=640x4 ...
- Docker 安装 Apache
查找Docker Hub上的httpd镜像 apache$ docker search httpd 拉取官方的镜像 docker pull httpd 使用apache镜像 创建目录apache,用于 ...
- libtool
[从网上摘录的,忘了从哪摘的了] libtool常见于autoconf/automake,单独用的例子很少,所以我想仔细研究一下,为将来兄弟们看起来方便. 一.libtool的作用offer a ...
- JSP和Servlet异常处理转发
<error-page> <!-- 指明异常类型. --> <exception-type>java.lang.ArrayIndexOutOfBoundsExcep ...
- Python 闭包、迭代器、生成器、装饰器
Python 闭包.迭代器.生成器.装饰器 一.闭包 闭包:闭包就是内层函数对外层函数局部变量的引用. def func(): a = "哈哈" def func2(): prin ...