目录
三个部分[Unit]、[Service]、[Install]配置说明
即看即用
- 在 /lib/systemd/system/ (or /usr/lib/systemd/system)下创建一个单元文件,比如:vsftpd.service/vsftpd.target
- 写配置文件
[Unit]
Description=vsftpd lightweight npm proxy registry
[Service]
Type=simple
Restart=on-failure
User=verdaccio
ExecStart=/usr/bin/vsftpd--config /etc/vsftpd/config.yaml
[Install]
WantedBy=multi-user.target
- 添加启动权限
# chmod +x vsftpd.service
启动服务:systemctl start vsftpd.service
关闭服务:systemctl stop vsftpd.service
重启服务:systemctl restart vsftpd.service
显示服务的状态:systemctl status vsftpd.service
在开机时启用服务:systemctl enable vsftpd.service
在开机时禁用服务:systemctl disable vsftpd.service
查看服务是否开机启动:systemctl is-enabled vsftpd.service
查看已启动的服务列表:systemctl list-unit-files|grep enabled
查看启动失败的服务列表:systemctl --failed
详细说明
systemd和systemctl详解 |https://www.liuvv.com/p/c9c96ac3.html
systemctl 的用途
有时我们将自定义程序注册为systemd service 进程管理,交由系统管理,可以方便启动停止,亦可以实现服务异常退出重启,开机自启动。 减少自定义程序服务管理的时间消耗。
历史上,Linux 的启动一直采用init进程。 Systemd 设计目标是,为系统的启动和管理提供一套完整的解决方案。
用法
1、新增单元文件如a.service(添chmod +x a.service),按要求里面写start、stop等对应要执行的操作。
2、单元文件放到/usr/lib/systemd/system (or /lib/systemd/system)文件夹下
3、可以用systemctl管理执行了:systemctl stop xxx,systemctl start xxx
(分*.service、*.Target、*.Device等12类单元文件,见systemd和systemctl详解 | https://www.liuvv.com/p/c9c96ac3.html)
例子:以管理我们的程序verdaccio为例
第1步:创建一个systemd unit 配置文件,比如:verdaccio.service,一般放在 /lib/systemd/system/ (or /usr/lib/systemd/system)下
内容如下:
[Unit]
Description=Verdaccio lightweight npm proxy registry
[Service]
Type=simple
Restart=on-failure
User=verdaccio
ExecStart=/usr/bin/verdaccio --config /etc/verdaccio/config.yaml
[Install]
WantedBy=multi-user.target
第2步:添加tomcat.service文件的启动权限
# chmod +x tomcat.service
第3步:使用
开机自启动:
systemctl enable verdaccio.service
立即启动:
systemctl start verdaccio.service
重新启动:
systemctl restart verdaccio.service
运行状态:
systemctl status verdaccio.service
原文链接:https://www.icode9.com/content-3-952939.html
开机启动
systemctl脚本存放在:/usr/lib/systemd/,有系统(system)和用户(user)之
分,需要开机不登陆就能运行的程序,存在系统服务里,即:/usr/lib/systemd/system目录下.
每一个服务以.service结尾,一般会分为3部分:[Unit]、[Service]和[Install]
[Unit]
部分主要是对这个服务的说明,内容包括Description和After,Description 用于描述服务,
After用于描述服务类别
Description=test # 简单描述服务
After=network.target # 描述服务类别,表示本服务需要在network服务启动后在启动
Before=xxx.service # 表示需要在某些服务启动之前启动,After和Before字段只涉及启动顺序,不涉及依赖关系。
[Service]部分是服务的关键,是服务的一些具体运行参数的设置.
Type=forking # 表示后台运行模式。
User=user # 设置服务运行的用户
Group=user # 设置服务运行的用户组
KillMode=control-group # 定义systemd如何停止服务
PIDFile=/usr/local/test/test.pid # 存放PID的绝对路径
Restart=no # 定义服务进程退出后,systemd的重启方式,默认是不重启
ExecStart=/usr/local/test/bin/startup.sh # 服务启动命令,命令需要绝对路径
ExecReload #为重启命令
ExecStop #为停止命令,
PrivateTmp=true # 表示给服务分配独立的临时空间
[Service]
注意:[Service]部分的启动、重启、停止命令全部要求使用绝对路径,使用相对路径则会报
错!
[Install]
[Install]部分是服务安装的相关设置,可设置为多用户的
首先,使用systemctl start [ 服务名(也是文件名) ] 可测试服务是否可以成功运行,如果不能运行 则可以使用systemctl status [ 服务名(也是文件名) ]查看错误信息和其他服务信息,然后根据报
错进行修改,直到可以start,如果不放心还可以测试restart和stop命令。
接着,只要使用systemctl enable xxxxx就可以将所编写的服务添加至开机启动即可。
[Unit]
Description=springboot webapp
After=springboot-webapp.service
[Service]
WorkingDirectory=/home/hlooc/app/springboot-webapp
Type=forking
Environment="JAVA_HOME=/home/hlooc/app/jdk1.8.0_202"
Environment="PATH=/home/hlooc/app/jdk1.8.0_202/bin:/usr/local/bin:/usr/bin:/usr/local/sbin:/usr/sbin:/home/hlooc/.local/bin:/home/hlooc/bin"
Environment="CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar"
User=hlooc
Group=hlooc
PIDFile=/home/hlooc/app/springboot-webapp/upp.pid
ExecStart=/home/hlooc/app/springboot-webapp/start.sh
ExecStop=/home/hlooc/app/springboot-webapp/stop.sh
PrivateTmp=true
[Install]
WantedBy=multi-user.target
服务操作
添加可执行权限:
chmod 754 /usr/lib/systemd/system/springboot-webapp.service
设置为开机自启动:
systemctl enable springboot-webapp.service常用指令(以springboot-webapp服务为例):
启动某服务
systemctl start springboot-webapp.service停止某服务
systemctl stop springboot-webapp.service重启某服务
service springboot-webapp restart
systemctl restart springboot-webapp.service使某服务自动启动(如springboot-webapp服务)
systemctl enable springboot-webapp.service使某服务不自动启动
systemctl disable springboot-webapp.service检查服务状态
systemctl status springboot-webapp.service (服务详细信息)
systemctl is-active springboot-webapp.service(仅显示是否Active)显示所有已启动的服务
systemctl list-units --type=service
-----------------------------------
Linux使用systemctl自启动服务
https://blog.51cto.com/u_15127670/4380043
设置程序开机启动、关闭、启用/禁用服务以vsftpd为例
启动服务:systemctl start vsftpd.service
关闭服务:systemctl stop vsftpd.service
重启服务:systemctl restart vsftpd.service
显示服务的状态:systemctl status vsftpd.service
在开机时启用服务:systemctl enable vsftpd.service
在开机时禁用服务:systemctl disable vsftpd.service
查看服务是否开机启动:systemctl is-enabled vsftpd.service
查看已启动的服务列表:systemctl list-unit-files|grep enabled
查看启动失败的服务列表:systemctl --failed
systemctl设置程序开机启动、关闭、启用/禁用服务以vsftpd为例
原文:https://www.cnblogs.com/Li-JT/p/14018659.html
.service 参数详解(更具体的可参考http://www.jinbuguo.com/systemd/systemd.service.html)
三个部分[Unit]、[Service]、[Install]配置说明
service文件中包含三个部分,分别是:[Unit]、[Service]、[Install]
[Unit] 部分 | |
---|---|
Description | 一段描述这个 Unit 文件的文字,通常只是简短的一句话。 |
Documentation | 指定服务的文档,可以是一个或多个文档的URL路径。 |
Requires | 依赖的其他 Unit 列表,列在其中的 Unit 模块会在这个服务启动的同时被启动,并且如果其中有任意一个服务启动失败,这个服务也会被终止 |
After | 与 Requires 相似,但会在后面列出的所有模块全部启动完成以后,才会启动当前的服务。 |
Before | 与 After 相反,在启动指定的任一个模块之前,都会首先确保当前服务已经运行。 |
Wants | 与 Requires 相似,但只是在被配置的这个 Unit 启动时,触发启动列出的每个 Unit 模块,而不去考虑这些模块启动是否成功。 |
Conflicts | 与这个模块有冲突的模块,如果列出模块中有已经在运行的,这个服务就不能启动,反之亦然。 |
OnFailure | 当这个模块启动失败时,就自动启动列出的每个模块。 |
PartOf |
与 Requires= 类似, 不同之处在于:仅作用于单元的停止或重启。 其含义是,当停止或重启这里列出的某个单元时, 也会同时停止或重启该单元自身。 注意,这个依赖是单向的, 该单元自身的停止或重启并不影响这里列出的单元。 如果 a.service 中包含了 PartOf=b.service ,那么这个依赖关系将在 b.service 的属性列表中显示为 ConsistsOf=a.service 。 也就是说,不能直接设置 ConsistsOf= 依赖。 |
@ |
在 Linux 上配置过 openvpn 的同学应该都看到过一些 `openvpn@client.service` 这样的例子: 若需在系统启动时自动启动 OpenVPN,对服务器端与客户端,都可以采用在对应机器上 启用 openvpn@.service 的方式配置。例如,如果客户端配置文件是 /etc/openvpn/client.conf,则服务名称应为 openvpn@client.service。或者,如果服务器端配置文件是 /etc/openvpn/server.conf,则服务名称应为 openvpn@server.service。 |
[Service] 部分 | |
---|---|
Type | 设置进程的启动类型。必须设为 其他类型说明见文章附录。 |
Environment | 为服务添加环境变量 |
EnvironmentFile | 指定加载一个包含服务所需的环境变量列表的文件,文件中的每一行都是一个环境变量的定义。 |
ExecStart | 这个参数是几乎每个 .service 文件都会有的,指定服务启动的主要命令,在每个配置文件中只能使用一次。需要使用绝对路径 |
ExecStartPre | 指定在启动执行 ExecStart 的命令前的准备工作,可以有多个,所有命令会按照文件中书写的顺序依次被执行。 |
ExecStartPost | 指定在启动执行 ExecStart 的命令后的收尾工作,也可以有多个。 |
ExecStop | 停止服务所需要执行的主要命令。需要使用绝对路径 |
ExecStopPost | 指定在 ExecStop 命令执行后的收尾工作,也可以有多个。 |
ExecReload | 重新加载服务所需执行的主要命令。需要使用绝对路径 |
Restart | 这个值用于指定在什么情况下需要重启服务进程。常用的值有 no,on-success,on-failure,on-abnormal,on-abort 和 always。默认值为 no,即不会自动重启服务。这些不同的值分别表示了在哪些情况下,服务会被重新启动 |
RestartSec | 如果服务需要被重启,这个参数的值为服务被重启前的等待秒数。 |
Nice | 服务的进程优先级,值越小优先级越高,默认为0。-20为最高优先级,19为最低优先级。 |
WorkingDirectory | 指定服务的工作目录。 |
RootDirectory | 指定服务进程的根目录( / 目录),如果配置了这个参数后,服务将无法访问指定目录以外的任何文件。 |
User | 指定运行服务的用户,会影响服务对本地文件系统的访问权限。 |
Group | 指定运行服务的用户组,会影响服务对本地文件系统的访问权限。 |
PrivateTmp | # 设为 true表示在进程的文件系统名字空间中挂载私有的 /tmp 与 /var/tmp 目录, 也就是不与名字空间外的其他进程共享临时目录。 这样做会增加进程的临时文件安全性,但同时也让进程之间无法通过 /tmp 或 /var/tmp 目录进行通信。 # 适用于web系统服务,不适用于mysql之类的数据库用户服务,数据库用户服务设为false。 PrivateTmp=true |
[Install] 部分 | |
---|---|
WantedBy | 依赖当前服务的模块。 “WantedBy=multi-user.target” 表明当系统以多用户方式(默认的运行级别)启动时,这个服务需要被自动运行。当然还需要 systemctl enable 激活这个服务以后自动运行才会生效 |
RequiredBy | 依赖当前服务的模块。 |
Also | 当这个服务被 enable/disable 时,将自动 enable/disable 后面列出的每个模块。 |
其中[Service] 部分Restart里面对应命令对应的情况如下图
作者:Hmcf
链接:https://www.jianshu.com/p/bc17d3162a48
systemctl或service启动服务日志
最近在使用 systemctl start xxx 发现启动失败了,可是并没有错误日志输出,这让人很抓狂!
最近在启动 minio 集群的时候,发现启动失败,可是并没有详细的错误日志输出,不好排查。
发现通过命令 journalctl -u 服务名 可以查找到指定服务的启动日志。
>> 简介
journalctl 用来查询 systemd-journald 服务收集到的日志。systemd-journald 服务是 systemd init 系统提供的收集系统日志的服务。在 Systemd 出现之前,Linux 系统及各应用的日志都是分别管理的,Systemd 开始统一管理了所有 Unit 的启动日志,这样带来的好处就是可以只用一个 journalctl 命令,查看所有内核和应用日志。
>> 常用命令
查看某个 Unit 的日志
journalctl -u minio.service
1
>> 结果
Aug 24 07:45:04 localhost.localdomain run.sh[6822]: /home/tools/minio/run.sh: line 5: /home/tools/minio: Is a directo
Aug 24 07:45:04 localhost.localdomain systemd[1]: minio.service: main process exited, code=exited, status=126/n/a
Aug 24 07:45:04 localhost.localdomain systemd[1]: Unit minio.service entered failed state.
Aug 24 07:45:04 localhost.localdomain systemd[1]: minio.service failed.
Aug 24 07:45:09 localhost.localdomain systemd[1]: minio.service holdoff time over, scheduling restart.
Aug 24 07:45:09 localhost.localdomain systemd[1]: Started Minio service.
Aug 24 07:45:09 localhost.localdomain systemd[1]: Starting Minio service...
Aug 24 07:45:09 localhost.localdomain run.sh[6825]: /home/tools/minio/run.sh: line 5: /home/tools/minio: Is a directo
Aug 24 07:45:09 localhost.localdomain systemd[1]: minio.service: main process exited, code=exited, status=126/n/a
Aug 24 07:45:09 localhost.localdomain systemd[1]: Unit minio.service entered failed state.
Aug 24 07:45:09 localhost.localdomain systemd[1]: minio.service failed.
Aug 24 07:45:14 localhost.localdomain systemd[1]: minio.service holdoff time over, scheduling restart.
原文链接:https://blog.csdn.net/mikelv01/article/details/108201676
systemctl和service的区别
区别
service是一个脚本命令,是去/etc/init.d目录下执行相关程序来启动服务。
systemd是Linux系统最新的初始化系统(init),作用是提高系统的启动速度,尽可能启动较少的进程,尽可能更多进程并发启动。systemd对应的进程管理命令是systemctl,兼容service,也会去/etc/init.d目录下,查看执行相关程序。
传统的init启动模式里面,有 RunLevel (运行级别),但是Systemd 是使用 Target 来管理。
链接:https://www.jianshu.com/p/bb2d68fb2987
为什么systemctl取代service
Linux 的启动一直采用init进程。串行启动时间长,启动脚本复杂。Systemd取代了initd,成为系统的第一个进程(PID= 1),提高系统的启动速度,尽可能启动较少的进程,尽可能更多进程并发启动。管理系统的服务、系统资源,不同的资源统称为 Unit。
目录
service服务配置文件存放目录/etc/init.d/。
Systemd 默认从目录/etc/systemd/system/读取配置文件。但是,里面存放的大部分文件都是符号链接,指向目录/usr/lib/systemd/system/,真正的配置文件存放在那个目录。systemctl enable命令用于在上面两个目录之间,建立符号链接关系。
链接:https://www.jianshu.com/p/bb2d68fb2987
service
方法按照格式新建个service放置于/etc/init.d文件中,然后使用chkconfig或者update-rc.d来设置运行级别开机启动。
RunLevel(运行级别)的概念
传统的init启动模式里面,有 RunLevel ,但是Systemd 是使用 Target 来管理。
默认的 RunLevel,在/etc/inittab文件设置,Target 是/etc/systemd/system/default.target,通常符号链接到graphical.target(图形界面)或者multi-user.target(多用户命令行)。
Target 与 传统 RunLevel 的对应关系:
Linux系统有7个运行级别(runlevel)
运行级别0:系统停机状态,系统默认运行级别不能设为0,否则不能正常启动
运行级别1:单用户工作状态,root权限,用于系统维护,禁止远程登陆
运行级别2:多用户状态(没有NFS)
运行级别3:完全的多用户状态(有NFS),登陆后进入控制台命令行模式
运行级别4:系统未使用,保留
运行级别5:X11控制台,登陆后进入图形GUI模式
运行级别6:系统正常关闭并重启,默认运行级别不能设为6,否则不能正常启动注:重点关注3和5就行了。
运行级别的原理:
1。在目录/etc/rc.d/init.d下有许多服务器脚本程序,一般称为服务(service)
2。在/etc/rc.d下有7个名为rcN.d的目录,对应系统的7个运行级别
3。rcN.d目录下都是一些符号链接文件,这些链接文件都指向init.d目录下的service脚本文件,命名规则为K+nn+服务名或S+nn+服务名,其中nn为两位数字。
4。系统会根据指定的运行级别进入对应的rcN.d目录,并按照文件名顺序检索目录下的链接文件
对于以K开头的文件,系统将终止对应的服务
对于以S开头的文件,系统将启动对应的服务
5。查看运行级别用:runlevel
6。进入其它运行级别用:init N
7。另外init0为关机,init 6为重启系统
原文链接:https://blog.csdn.net/wanglei9876/article/details/50338279
此时/etc/inittab文件已经不再使用了,查看里面其实都是注释与说明:
查看默认运行级别: systemctl get-default
修改用户级别为多用户命令行:sudo systemctlset-default multi-user.target。即为删除原有链接,新建multi-user.target新链接。可用通过命令systemctl list-dependencies multi-user.target查看 multi-user.target启动时的默认 Target。
本章节摘自:https://www.jianshu.com/p/bb2d68fb2987
====================================================
好文备份:systemd和systemctl详解 | Levonfly's Blog
systemd和systemctl详解 | Levonfly's Blog
1. Systemd
1.1 前言
历史上,Linux 的启动一直采用init进程。 Systemd 设计目标是,为系统的启动和管理提供一套完整的解决方案。
Systemd 是一系列工具的集合,其作用也远远不仅是启动操作系统,它还接管了后台服务、结束、状态查询,以及日志归档、设备管理、电源管理、定时任务等许多职责,并支持通过特定事件(如插入特定 USB 设备)和特定端口数据触发的 On-demand(按需)任务。
Systemd 的后台服务还有一个特殊的身份——它是系统中 PID 值为 1 的进程。
1.2 特点
-
更少的进程
Systemd 提供了 服务按需启动 的能力,使得特定的服务只有在真定被请求时才启动。
-
允许更多的进程并行启动
在 SysV-init 时代,将每个服务项目编号依次执行启动脚本。Ubuntu 的 Upstart 解决了没有直接依赖的启动之间的并行启动。而 Systemd 通过 Socket 缓存、DBus 缓存和建立临时挂载点等方法进一步解决了启动进程之间的依赖,做到了所有系统服务并发启动。对于用户自定义的服务,Systemd 允许配置其启动依赖项目,从而确保服务按必要的顺序运行。
-
使用 CGroup 跟踪和管理进程的生命周期
在 Systemd 之间的主流应用管理服务都是使用 进程树 来跟踪应用的继承关系的,而进程的父子关系很容易通过 两次 fork 的方法脱离。
而 Systemd 则提供通过 CGroup 跟踪进程关系,引补了这个缺漏。通过 CGroup 不仅能够实现服务之间访问隔离,限制特定应用程序对系统资源的访问配额,还能更精确地管理服务的生命周期。
-
统一管理服务日志
Systemd 是一系列工具的集合, 包括了一个专用的系统日志管理服务:Journald。这个服务的设计初衷是克服现有 Syslog 服务的日志内容易伪造和日志格式不统一等缺点,Journald 用 二进制格式 保存所有的日志信息,因而日志内容很难被手工伪造。Journald 还提供