linux创建自定义服务

一世执手 提交于 2019-12-18 16:46:36

1.进入系统服务目录

在linux中,进入目录,命令:cd /lib/systemd/system,如下图

在这里插入图片描述

2.创建一个自定义服务

例如:sudo vim push_msg_swoole.service

3.编写自定义服务

如下三部分:[Unit] [Service] [Install]

[Unit]
Description=push_msg_swoole.service
After=rc-local.service

[Service]
Type=simple
User=root
Group=root
WorkingDirectory=/home/apiV3
//启动服务的命令(此处写你的frps的实际安装目录)
ExecStart=/usr/bin/nice -n 0 /usr/local/php/bin/php /home/apiV3/push_msg_swoole.php
Restart=always
RestartSec=3//每三秒运行一次(根据各自需求,可以不设置,删掉)

[Install]
WantedBy=multi-user.target

4.开启服务

开启服务并查看服务状态

systemctl daemon-reload
systemctl start push_msg_swoole.service
systemctl status push_msg_swoole.service
或者:
service push_msg_swoole.service start
service push_msg_swoole.service status

在这里插入图片描述

5.服务脚本说明

主要分成三个部分:[Unit] [Service] [Install]

5.1 [Unit]

Unit表明该服务的描述,服务的依赖关系。比较典型的情况是单元A要求在单元B启动之后再启动。这种设置是通过Unit下面的Requires、After、Before、Wants来调整的。常用的命令有:

Description:一般是服务简短的描述。
Documentation:一般是服务文档的链接等。
Requires:一般写本服务依赖的其他服务,启动本服务时,一般会并行的启动该服务和它所依赖的服务,如果它依赖的服务启动失败了,本服务将无法启动成功。
Wants:与Requires类似,但是相对宽松一些,即使依赖的服务启动失败了,本服务也可以继续正常启动,一般的依赖都推荐使用这个命令。
BindsTo:和Requires=类似,但是如果依赖的服务停止了,本服务也会停止。
Before和After:这两个需要和上面描述依赖关系的命令一起使用,表示依赖的当前服务与依赖的服务启动的先后顺序,Before表示当前服务启动成功后才可以启动依赖服务,After则相反。
Conflicts:这个命令后面跟的服务将不能和当前服务同时运行,如果当前服务运行则会导致该命令列举的服务被停止。
Condition…:这个命令往往和许多其他命令一起使用,用来测试一些条件,比如测试当前的操作系统。如果条件不满足,则跳过当前服务的启动。
Assert…:和Condition…类似,但是如果条件检测不满足会导致失败。

例如:
Requires=B
After=B

这段设置表明了A的启动依赖于B,同时有要求在B启动之后启动自己。设置十分简介。

5.2 [Service]

Service是脚本的关键部分,这一部分用于设置一些关键参数

service的Type配置:

首先是Type配置,在service片段中有Type的配置,这个配置给当前的服务单元用于设置进程的启动类型。
Type有如下几种可选项:simple,forking,oneshot,dbus,notify,idel

simple:默认的Type,当Type和BusName配置都没有设置,指定了ExecStart设置后,simple就是默认的Type设置。simple使用ExecStart创建的进程作为服务的主进程。在此设置下systemd会立即启动服务,如果该服务要启动其他服务(simple不会forking),它们的通讯渠道应当在守护进程启动之前被安装好。

forking:如果使用了这个Type,则ExecStart的脚本启动后会调用fork()函数创建一个进程作为其启动的一部分。当一切初始化完毕后,父进程会退出。子进程会继续作为主进程执行。这是传统UNIX主进程的行为。如果这个设置被指定,建议同时设置PIDFile选项来指定pid文件的路径,以便systemd能够识别主进程。

oneshot:onesh的行为十分类似simple,但是,在systemd启动之前,进程就会退出。这是一次性的行为。可能还需要设置RemainAfterExit=yes,以便systemd认为j进程退出后仍然处于激活状态。

dbus:这个设置也和simple很相似,该配置期待或设置一个name值,通过设置BusName=设置name即可。

notify:与 Type=simple 相同,但约定服务会在就绪后向 systemd 发送一个信号,这一通知的实现由 libsystemd-daemon.so 提供。

注意:在脚本中关于服务启动、重启、关闭的指令需要使用绝对路径,否则会出现无法识别的情况。

service其他配置节点:

RemainAfterExit:默认值为no,这个设置采用booleean值,可以是0、no、off、1、yes、on等值。它表明服务是否应当被视为激活的,即便当它所有的进程都退出了。简言之,这个设置用于告诉systemd服务是否应当是被视为激活状态,而不管进程是否退出。当为true时,即便服务退出,systemd依然将这个服务视为激活状态,反之则服务停止

GuessMainPID:采用boolean值指定systemd在无法确切的查明服务的时候是否需要猜测服务的main pid。除非Type=forking被采用并且PIDFile没有被设置,否则这个选项会被忽略。因为当设置为Type的其他选项,或者显示的指定了PID文件后,systemd总是能够知道main pid

PIDFile:采用一个绝对路径的文件名指定守护进程的PID文件。当Type=forking被设置的时候,建议采取这个设置。当服务启动后,systemd会读取守护进程的主进程id。systemd不会对该文件写入数据

BusName:使用一个D-Bus的总线名称,作为该服务的可访问名称。当Type=dbus的时候,该设置被强制使用

BusPolicy:如果该选项被指定,一个自定义的kdbus终结点将会被创建,并且会被指定为默认的dbus节点安装到服务上。这样的自定义终结点自身持有一个策略规则集合。这些规则将会在总线范围内被强制指定。该选项只有在kdbus被激活时有效

WorkingDirectory:这个路径就是ExecStart的路径

ExecStart:当服务启动的时候,会执行这个选项的值,这个值一般是“ExecStart=指令 参数”的形式。当Type=oneshot的时候,只有一个指令可以并且必须给出。原因是oneshot只会被执行一次

User:设置服务运行的用户,如:User=users

Group:设置服务运行的用户组,如:Group=users

PrivateTmp: 是否分配独立的临时空间(缺省)

ExecReload:服务重启时执行

ExecStop:服务停止时执行

ExecStopPost:服务停止后执行

Environment:环境变量设置,可以设置多个,如“GOPATH=/usr/local/go”

DefaultTimeoutStartSec:服务启动允许的最大时长,超时时间(默认无单位:秒)

5.3 [Install]

WantedBy=multi-user.target
multi-user.target:表明当系统以多用户方式(默认的运行级别)启动时,这个服务需要被自动运行。

6.常见命令

# 自启动
systemctl enable xxx.service
# 禁止自启动
systemctl disable xxx.service
# 启动服务
systemctl start xxx.service
# 停止服务
systemctl stop xxx.service
# 重启服务
systemctl restart xxx.service

# 查看Unit定义文件
systemctl cat xxx.service
# 编辑Unit定义文件
systemctl edit xxx.service
# 重新加载Unit定义文件
systemctl reload xxx.service

# 列出已启动的所有unit,就是已经被加载到内存中
systemctl list-units
# 列出系统已经安装的所有unit,包括那些没有被加载到内存中的unit
systemctl list-unit-files

# 查看服务的日志
journalctl -u xxx.service    # 还可以配合`-b`一起使用,只查看自本次系统启动以来的日志


以上完成的操作如有不正确的地方还望诸位多多指教
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!