我们可以将自定义程序或脚本如shell, python, perl , php 脚本,注册为systemd service进程管理交给系统管理,可以方便启动停止,也可以实现服务异常退出重启,开机自启动,减少自定义程序服务管理的时间消耗。
定义软件服务的文件通常是systemd服务单元文件,具有.service后缀,这些文件通常位于以下目录:
# 系统或用户自定义的配置文件
/etc/systemd/system/
# 软件运行时生成的配置文件
/run/systemd/system
# 系统或第三方软件安装时添加的配置文件。
/usr/lib/systemd/system
Linux 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,即不会自动重启服务。这些不同的值分别表示了在哪些情况下,服务会被重新启动 |
| RestartSec | 如果服务需要被重启,这个参数的值为服务被重启前的等待秒数。 |
| Nice | 服务的进程优先级,值越小优先级越高,默认为0。-20为最高优先级,19为最低优先级。 |
| WorkingDirectory | 指定服务的工作目录。 |
| RootDirectory | 指定服务进程的根目录( / 目录),如果配置了这个参数后,服务将无法访问指定目录以外的任何文件。 |
| User | 指定运行服务的用户,会影响服务对本地文件系统的访问权限。 |
| Group | 指定运行服务的用户组,会影响服务对本地文件系统的访问权限。 |
| PrivateTmp | 是否给服务分配独立的临时空间(true/false) |
| RemainAfterExit | 启动命令退出时,是否保持服务.启动命令分为前台命令和后台命令.当启动命令为后台命令时,必须加此参数. 避免执行start后退出导致inactived状态触发stop执行 (yes/no) |
| [Install] | |
| WantedBy | 和前面的 Wants 作用相似,只是后面列出的不是服务所依赖的模块,而是依赖当前服务的模块。“WantedBy=multi-user.target” 表明当系统以多用户方式(默认的运行级别)启动时,这个服务需要被自动运行。当然还需要 systemctl enable 激活这个服务以后自动运行才会生效。 |
| RequiredBy | 和前面的 Requires 作用相似,同样后面列出的不是服务所依赖的模块,而是依赖当前服务的模块。 |
| Also | 当这个服务被 enable/disable 时,将自动 enable/disable 后面列出的每个模块。 |
注意:[Service]的启动、重启、停止命令全部要求使用绝对路径
以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
# 在开机时禁用一个服务
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
常用程序的启动服务
redis.service
[Unit]
Description=Redis persistent key-value database
After=network.target network-online.target remote-fs.target nss-lookup.target
Wants=network-online.target
# cp -f redis.service /usr/lib/systemd/system/ && systemctl daemon-reload && systemctl enable redis.service
# systemctl start redis.service
[Service]
ExecStart=/usr/local/redis6/bin/redis-server /usr/local/redis6/bin/redis.conf --daemonize no --supervised systemd
ExecStop=/usr/local/redis6/redis_shutdown.sh
Type=simple
User=root
[Install]
WantedBy=multi-user.target
nginx.service
[Unit]
Description=The nginx HTTP and reverse proxy server
After=network-online.target remote-fs.target nss-lookup.target systemd-hostnamed.service
Wants=network-online.target
# cp nginx.service /usr/lib/systemd/system/ && systemctl daemon-reload && systemctl enable nginx.service
# systemctl start nginx.service
# systemctl enable nginx.service
[Service]
Type=forking
PIDFile=/usr/local/nginx/logs/nginx.pid
ExecStartPre=/usr/bin/rm -f /usr/local/nginx/logs/nginx.pid
ExecStartPre=/usr/local/nginx/sbin/nginx -t
ExecStart=/usr/local/nginx/sbin/nginx
ExecReload=/usr/local/nginx/sbin/nginx -s reload
KillSignal=SIGQUIT
TimeoutStopSec=60
KillMode=mixed
PrivateTmp=true
[Install]
WantedBy=multi-user.target
xxljob.service
[Unit]
Description=Xxljob
After=network-online.target
# cp xxljob.service /usr/lib/systemd/system/
# systemctl daemon-reload && systemctl enable xxljob.service
# systemctl start xxljob.service
[Service]
ExecStartPre=/bin/sleep 5
ExecStart=/usr/bin/java -jar -server -Xms1280m -Xmx1280m -XX:MetaspaceSize=512m -XX:MaxMetaspaceSize=512m /root/app/xxl-job-admin-2.3.1.jar > /dev/null
TimeoutStartSec=120
[Install]
WantedBy=multi-user.target
olakit.service
[Unit] Description=olakit website server After=network.target # cp olakit.service /usr/lib/systemd/system/ && systemctl daemon-reload # systemctl enable olakit.service # systemctl start olakit.service [Service] Type=forking ExecStart=/home/webroot/olakit.cn/startup.sh # RemainAfterExit 避免执行start后退出导致inactived状态触发stop执行 RemainAfterExit=yes ExecStop=/home/script/kill_proc.sh olakit TimeoutStartSec=30 [Install] WantedBy=multi-user.target
关联阅读
https://www.freedesktop.org/software/systemd/man/latest/systemd.service.html