编写systemctl⾃启动服务
Systemd简介
Centos7 以上使⽤Systemd进⾏系统初始化,Systemd是Linux系统中最新的初始化⼯具,它可以有效的提⾼系统的启动速度。
Systemd 默认从⽬录/etc/systemd/system/读取配置⽂件。然⽽,⾥⾯存放的⼤部分⽂件都是符号链接,它们指向⽬录/usr/lib/systemd/system/,真正的配置⽂件(以 .service 结尾的⽂件)存放在那个⽬录。
我们可以将⾃定义程序注册为systemd service进程管理交给系统管理,可以⽅便启动停⽌,也可以实现服务异常退出重启,开机⾃启动,减少⾃定义程序服务管理的时间消耗。Systemd配置与命令
service⽂件参数详解
service⽂件主要包含三个部分,分别是:[Unit]、[Service]、[Install]
如以下的nginx.service配置⽂件
# 配置⽂件内容
[Unit]
Description=nginx
After=network.target
[Service]
Type=forking
ExecStart=/usr/local/nginx/sbin/nginx
ExecReload=/usr/local/nginx/sbin/nginx -s reload
ExecStop=/usr/local/nginx/sbin/nginx -s quit
PrivateTmp=true
[Install]
WantedBy=multi-user.target
参数说明如下
参数名称参数说明
[Unit]
Description⼀段描述这个 Unit ⽂件的⽂字,通常只是简短的⼀句话。
Documentation指定服务的⽂档,可以是⼀个或多个⽂档的URL路径。
Requires依赖的其他 Unit 列表,列在其中的 Unit 模块会在这个服务启动的同时被启动,并且如果其中有任意⼀个服务启动失
败,这个服务也会被终⽌
After与 Requires 相似,但会在后⾯列出的所有模块全部启动完成以后,才会启动当前的服务。
Before与 After 相反,在启动指定的任⼀个模块之前,都会⾸先确保当前服务已经运⾏。
Wants与 Requires 相似,但只是在被配置的这个 Unit 启动时,触发启动列出的每个 Unit 模块,⽽不去考虑这些模块启动
是否成功。
Conflicts与这个模块有冲突的模块,如果列出模块中有已经在运⾏的,这个服务就不能启动,反之亦然。
OnFailure当这个模块启动失败时,就⾃动启动列出的每个模块。
[Service]
Type 服务的类型,常⽤的有 simple(默认类型)和 forking。默认的 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,即不会⾃动重启服务。这些不同的值分别表⽰了在哪些情况下,服务会被重新启动
注意:[Service]的启动、重启、停⽌命令全部要求使⽤绝对路径
想了解更详细的参数说明可以在中查看
systemctl 常⽤命令
以nginx.service 为例
# 启动nginx 服务
systemctl start nginx.service
# 停⽌nginx 服务
systemctl stop nginx.service
# 重启nginx 服务
systemctl restart nginx.service
# 查看nginx 服务状态
systemctl status nginx.service
# 在开机时启⽤⼀个服务
systemctl enable nginx.service
# 在开机时禁⽤⼀个服务
nginx停止命令
systemctl disable nginx.service
# 查看服务是否开机启动
systemctl is-enabled nginx.service
# 重新读取nginx 配置(不⽤停⽌nginx 服务就能使修改的配置⽣效)
systemctl reload nginx.service
# 重新加载systemd(⼀般修改完配置⽂件执⾏该命令使配置⽣效)
systemctl daemon-reload
# 查看已启动的服务列表
systemctl list-unit-files | grep enabled
# 查看启动失败的服务列表
systemctl --failed
其中,systemctl enable 命令⽤于/etc/systemd/system/和/usr/lib/systemd/system/两个⽬录之间,建⽴符号链接关系。
systemctl enable nginx.service
# 等同于
ln -s '/usr/lib/systemd/system/nginx.service' '/etc/systemd/system/multi-user.target.wants/nginx.service'
systemd 默认从⽬录/etc/systemd/system/读取配置⽂件,所以systemctl enable 命令相当于激活开机启动。
同理,systemctl disable ⽤于撤销两个⽬录之间的符号链接关系,也就撤销了开机启动。
编写systemd ⾃启动服务
在上⾯内容的基础下,我们尝试编写⼀个⾃⼰的systemd 服务,本次的systemd 服务主要是执⾏⼀段python 脚本。
在/root/pyfile 路径(这⾥可以改为你⾃⼰的路径)下创建run.py ,内容如下
import time
import string
import random
f = open('/root/', 'w')
for i in range(100):
words = ''.join(random.sample(string.ascii_lowercase, 5))
row = '--- No.{}, {} ---\n'.format(i, words)
f.write(row)
f.flush()
time.sleep(2)
f.close()abort 和 always 。默认值为 no ,即不会⾃动重启服务。这些不同的值分别表⽰了在哪些情况下,服务会被重新启动
RestartSec
如果服务需要被重启,这个参数的值为服务被重启前的等待秒数。Nice
服务的进程优先级,值越⼩优先级越⾼,默认为0。-20为最⾼优先级,19为最低优先级。WorkingDirectory
指定服务的⼯作⽬录。RootDirectory
指定服务进程的根⽬录( / ⽬录),如果配置了这个参数后,服务将⽆法访问指定⽬录以外的任何⽂件。User
指定运⾏服务的⽤户,会影响服务对本地⽂件系统的访问权限。Group
指定运⾏服务的⽤户组,会影响服务对本地⽂件系统的访问权限。PrivateTmp
是否给服务分配独⽴的临时空间(true/false )[Install]
WantedBy
和前⾯的 Wants 作⽤相似,只是后⾯列出的不是服务所依赖的模块,⽽是依赖当前服务的模块。“Want
edBy=multi-user.target” 表明当系统以多⽤户⽅式(默认的运⾏级别)启动时,这个服务需要被⾃动运⾏。当然还需要systemctl enable 激活这个服务以后⾃动运⾏才会⽣效。RequiredBy
和前⾯的 Requires 作⽤相似,同样后⾯列出的不是服务所依赖的模块,⽽是依赖当前服务的模块。Also 当这个服务被 enable/disable 时,将⾃动 enable/disable 后⾯列出的每个模块。
以上脚本的作⽤是在100次遍历中,每2s⽣成⼀个随机的单词,并将单词写⼊到a.txt中。
接下来我们来编写⾃定义的systemd服务,在/usr/lib/systemd/system路径下新建pyscript.service服务,内容如下[Unit]
Description=python script
[Service]
Type=simple
WorkingDirectory=/root/pyfile
ExecStart=python run.py
[Install]
WantedBy=multi-user.target
编写完成后,保存并执⾏以下命令
systemctl daemon-reload
systemctl start pyscript.service
进⼊/root/pyfile⽬录下执⾏tail -可以看出每2s打印⼀个随机单词,如下
--- No.0, jkqdr ---
--- No.1, beqvu ---
--- No.2, eaqrw ---
--- No.3, kuljf ---
--- No.4, qmzhl ---
接下来我们设置开机启动pyscript.service服务
systemctl start pyscript.service
执⾏后系统⽣成了⼀个符号链接,如下
Created symlink /etc/systemd/system/multi-user.target.wants/pyscript.service → /usr/lib/systemd/system/pyscript.service.然后重启服务器,等待重启完毕后,执⾏以下命令查看python脚本是否执⾏
ps -ef | grep python
可以发现多了如下进程
root  738  1  0 18:00 ?    00:00:00 /usr/bin/python run.py
再次进⼊/root/pyfile⽬录,执⾏tail -,可以发现⽂本正在打印。
⾃此,我们已经成功完成了⾃定义systemd服务的编写和启动。

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。