【linux】使用systemctl start xxx启动自己的程序|开机启动|守护进程

目录

即看即用

详细说明

systemctl 的用途

用法

例子:以管理我们的程序verdaccio为例

开机启动

设置程序开机启动、关闭、启用/禁用服务以vsftpd为例

三个部分[Unit]、[Service]、[Install]配置说明

systemctl或service启动服务日志

systemctl和service的区别


即看即用

  • 在 /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

(systemd 常用操作及配置 | Yiran's Blog)

[Service] 部分
Type

设置进程的启动类型。必须设为 simpleexecforkingoneshotdbusnotifyidle 之一,默认的 simple 类型可以适应于绝大多数的场景,因此一般可以忽略这个参数的配置。而如果服务程序启动后会通过 fork 系统调用创建子进程,然后关闭应用程序本身进程的情况,则应该将 Type 的值设置为 forking,否则 systemd 将不会跟踪子进程的行为,而认为服务已经退出。

其他类型说明见文章附录。

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 还提供

  • 0
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值