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`一起使用,只查看自本次系统启动以来的日志
以上完成的操作如有不正确的地方还望诸位多多指教
来源:CSDN
作者:小白的程序猿
链接:https://blog.csdn.net/Hjingeng/article/details/103598279