站点图标 Linux-技术共享

什么叫做Linux之systemd启动过程

守护进程#

Docker#

更新 Docker 容器的 Restart 策略 以达到进程守护效果。

docker update --restart=unless-stopped artalk-go

Docker Compose#

在 docker-compose.yml 文件给服务添加 restart: unless-stopped 策略:

version: '3'
services:
  artalk:
+   restart: unless-stopped

tmux#

tmux 将创建一个持续的命令行会话,在 SSH 或 tty 断开后保持在后台。

Note: 服务器关闭或重启后,tmux 会话将被清除,需要手动重新运行程序。

  1. 创建会话 tmux new -s artalk-go
  2. 运行程序 ./artalk-go server

恢复接入会话:tmux attach -t artalk-go

查看所有会话:tmux ls

systemd#

sudo vim /etc/systemd/system/artalk-go.service

[Unit]
Description=Artalk Go
After=network.target remote-fs.target nss-lookup.target

[Service]
User=root
ExecStart=<ArtalkGo 执行文件绝对路径> server -w <工作目录绝对路径> -c <配置文件相对于工作目录路径>
ExecReload=/bin/kill -s HUP $MAINPID
ExecStop=/bin/kill -s QUIT $MAINPID
Restart=on-abnormal
RestartSec=5s

[Install]
WantedBy=multi-user.target

Tip: 设置 alias 简化命令输入;ArtalkGo 参数 -w 用于指定工作目录,配置文件中的所有「相对路径」会基于该目录,例如 ./data/ 文件夹。

Supervisor#

以宝塔面板举例:打开「软件商店」,搜索并安装「Supervisor管理器」:

安装后,打开插件,点击「添加守护程序」:

  • 启动用户:root 或其他
  • 运行目录:点击右侧图标,选择 Artalk 所在目录
  • 启动命令:./artalk-go server
systemctl
systemctl管理的服务脚本存放在/usr/lib/systemd/ 有user与systemd区分需要开机自启动存放在system目录下:/usr/lib/systemd/system

基本介绍
服务的脚本一般以.service结尾
service文件一般由:[Unit]、[Service]和[Install] 三部分组成
备注: 官方分为:[Unit]、[unit type] 和[Install]
unit type 如果一个单元具有特殊类型定义则将它们定义在类型命名之后,比如Service定义为[Service]
1.[Unit]
主要是对这个服务的说明,内容, 文档介绍以及对一些依赖服务定义
2.[Service]
服务的主体定义,主要定义服务的一些运行参数,及操作动作
3.[Install]
服务安装的相关设置,一般可设置为多用户的
具体参数
[Unit]
[Unit]
Description 服务描述,作为systemctl status 命令输出的一个介绍
Documentation 一个url 定义服务的具体介绍网址
After 在什么服务启动之后
Before 在什么服务启动之前启动
Requires 依赖其他的单元服务, 需要与列出的服务一起激活,若任何服务无法启动,则该单元不会被激活
Wants 比Requires依赖性弱,弱其他服务没有启动成功,该服务也不受影响,只是表示一种推荐
[Service]
[Service]
Type
1.simple默认参数,进程作为主进程
2.forking是后台运行的形式,主进程退出,os接管子进程
3.oneshot 类似simple,在开始后续单元之前,过程退出
4.DBUS 类似simple,但随后的单元只在主进程获得D总线名称之后才启动
5.notify 类似simple,但是随后的单元仅在通过sd_notify()函数发送通知消息之后才启动
6.idle类似simple,服务二进制文件的实际执行被延迟到所有作业完成为止,不与其他服务的输出相混合,如状态输出与服务的shell输出混合
备注:以上的类似simple指的是类似simple将启动进程作为主进程进行运行
User
设置服务运行的用户,
Group
设置服务运行的用户组,
PIDFile
为存放PID的文件路径, 对于type设置为forking建议使用该项。 systemd will read
the PID of the main process of the daemon after start-up of the service. systemd will not write to the file configured here,
although it will remove the file after the service has shut down if it still exists.
ExecStart
服务的具体运行命令,ExecStartPre和ExecStartPost指定在ExecStart前后执行的自定义命令。
若使用Type = OnHead可以指定多个自定义命令,将依次执行这些命令。
ExecReload
为重启命令,重新加载的动作, 重新加载时执行的命令或者脚本
ExecStop
为停止命令,停止时要执行的命令或脚本
ExecStartPre:启动服务之前执行的命令
ExecStartPost:启动服务之后执行的命令
ExecStopPost:停止服务之后执行的命令
Restart
定义何种情况Systemd会自动重启当前服务,值:
包括always(总是重启)、no 、on-success、on-failure、on-abnormal、on-abort、on-watchdog
对于守护进程,推荐设为on-failure。对于那些允许发生错误退出的服务,可以设为on-abnormal


TimeoutStartSec
等待启动的时间。如果守护进程服务没有在配置的时间内发送启动完成的信号,则该服务将被认为失败, 服务将退出。
以秒为单位, “0”来禁用。默认为, 默认使用DefaultTimeoutStartSec,
若使用Type=oneshot,则该模式默认情况下超时是禁用的
TimeoutStopSec
等待关闭的超时时间
TimeoutSec=
快速配置TimeoutStartSec和TimeoutStopSec时间
KillMode
control-group(默认值):当前控制组里面的所有子进程,都会被杀掉
process:只杀主进程
mixed:主进程将收到 SIGTERM 信号,子进程收到 SIGKILL 信号
none:没有进程会被杀掉,只是执行服务的 stop 命令。
Environmen
指定环境变量
PrivateTmp=True
表示给服务分配独立的临时空间
注意:[Service]部分的启动、重启、停止命令必须使用绝对路径,使用相对路径则会报错
[Install]
[Install]
RequiredBy 依赖该服务的服务列表
WantedBy 表示该服务所在的 Target, multi-user.target 可以设置为多用户模式具体参考手册systemd.unit(5)
服务状态列表
loaded 系统服务已经初始化完成,加载过配置
actvie(running) 正常运行
actvie(exited) 正常结束的服务,
active(waitting) 正在执行当中, 等待其他的事件才继续处理
inactive 服务关闭
enabled 服务开机启动
disabled 服务开机不自启
static 服务开机启动项不可被管理
falied 系统配置错误
Systemd 统一管理所有 Unit 的启动日志。
journalctl命令查看所有日志(内核日志和应用日志)
日志的配置文件是/etc/systemd/journald.conf

示例
[Unit]
Description=my test service
After=network.target remote-fs.target nss-lookup.target
 
[Service]
#Type=forking
PIDFile=/tmp/mxy.pid
ExecStartPre=/usr/bin/rm -f /tmp/mxy.pid
ExecStart= /usr/sbin/test.sh
KillSignal=SIGQUIT
TimeoutStopSec=5
KillMode=process
PrivateTmp=true
 
#[Install]
#WantedBy=multi-user.target
.shell文件test.sh
#!/bin/bash
while true
do
   echo `date`,"ok" >>/tmp/result.log
done
#注意#!/bin/bash是必须的,否则会提示203错误异常,服务启动失败
参数
启动一个服务:systemctl start nginx.service
关闭一个服务:systemctl stop postfix.service
重启一个服务:systemctl restart nginx.service
显示一个服务的状态:systemctl status postfix.service
在开机时启用一个服务:systemctl enable nginx.service
在开机时禁用一个服务:systemctl disable nginx.service
查看服务是否开机启动:systemctl is-enabled nginx.service
查看已启动的服务列表:systemctl list-unit-files|grep enabled
查看启动失败的服务列表:systemctl --failed
退出移动版