SysVinit

SystemVinit是一个传统的UNIX初始化系统,在较老旧的操作系统中使用,如CentOS6、Fedora14、Debian7、Ubuntu14.04、openSUSE11.4,服务的管理命令为 initctl,配置文件路径为 /etc/init,配置文件后缀为 .conf

配置文件模板

对于简单的可执行文件(比如Golang应用):

# 在哪种运行级别下启动服务
start on filesystem or runlevel [2345]
# 在哪种运行级别下停止服务
stop on runlevel [!2345]
# 自动重启
respawn
# 启动命令
exec /usr/bin/dockerd -H unix:///var/run/docker.sock

对于Apache Tomcat:

# 在哪种运行级别下启动服务
start on runlevel [2345]
# 在哪种运行级别下停止服务
stop on runlevel [!2345]

# 自动重启
respawn
# 重启次数限制
respawn limit 10 5

# 服务运行时的用户身份
setuid root
# 服务运行时的用户组
setgid root

# 服务可以打开的文件描述符的最大数量限制
limit nofile 8192 8192

# 设置环境变量
env JAVA_HOME=/usr/lib/jvm/jdk-1.8-oracle-x64
env CATALINA_HOME=/root/apache-tomcat-9.0.78

# 启动命令
exec $CATALINA_HOME/bin/catalina.sh run >> "/root/apache-tomcat-9.0.78/logs/catalina.out" 2>&1

# 启动命令结束之后执行的脚本块
post-stop script
  rm -rf $CATALINA_HOME/temp/*
end script

常用命令

重载配置文件 initctl reload-configuration

启动服务 initctl start <服务名>

停止服务 initctl stop <服务名>

重启服务 initctl restart <服务名>

服务状态 initctl status <服务名>

服务列表 initctl list

参考资料:upstart把应用封装成系统服务

systemd

systemd是一个现代化的初始化系统,它在CentOS7+、Fedora15+、Debian8+、Ubuntu15.04+、openSUSE12.1中被引入并取代了SysVinit,提供了更快的启动时间、并行启动任务、动态加载和卸载守护进程,以及更高级的特性。

systemd的配置文件后缀是 .service。这些配置文件用于定义系统中的服务(也称为单元),包括其运行方式、依赖关系和其他相关设置。

在Linux系统中,systemd配置文件通常存储在 /etc/systemd/system/目录中。这是系统级的配置目录,用于存放自定义的服务配置文件。如果需要用户级别的配置,也可以将配置文件放置在 ~/.config/systemd/user/目录中。

除了主要的 .service配置文件之外,systemd还支持其他类型的配置文件,例如 .target(目标单元)、.timer(定时任务)、.socket(套接字)、.path(路径监视器)等。这些配置文件也可以放置在相应的目录中。

对于已经安装的软件包提供的服务,配置文件通常位于 /usr/lib/systemd/system//lib/systemd/system/目录中,而不应直接编辑这些文件。系统管理员可以在 /etc/systemd/system/目录中创建一个与已安装服务命名相同的新配置文件,来覆盖默认设置。

配置文件模板

最简单的一个配置模板如下:

[Unit]
Description=my app #简介
After=network.target #在指定目标单元启动之后

[Service]
Type=simple #服务单元的类型*
ExecStart=/usr/bin/bash /root/startup.sh -arg1 aaa -arg2 bbb #启动命令

[Install]
WantedBy=multi-user.target

*其中,Type有以下几种选择:

1. simple:该服务将被执行为单个进程。
2. forking:该服务将被执行为一个主进程和一个子进程,主进程在后台运行,而子进程负责实际的工作。通常用于那些以守护进程方式运行的服务。
3. oneshot:该服务将只运行一次,并在完成后立即退出。它通常用于执行系统启动时的一次性任务。
4. dbus:该服务通过DBus接口来与其他service执行通信。
5. notify:该服务通过向systemd发送通知信号来指示它已成功启动。

完整配置模板:

[Unit]
Description= #简介
After= #在指定目标单元启动之后
Documentation= #指示文档路径或者URL
After= #在本服务启动之前启动(弱依赖)
Before= #在本服务启动之后启动(弱依赖)
Requires= #在本服务启动之前启动(强依赖)
Wants= #本服务启动之后,启动其它的服务

[Service]
Type= #服务单元的类型
EnvironmentFile= #环境变量或者环境配置文件
ExecStart= #启动命令
ExecStop= #停止命令
ExecReload= #重载命令
Restart= #重启选项**
RemainAfterExit= #可选yes/no,为yes时,服务在退出后将保持运行状态。这意味着systemd将继续认为服务处于活动状态,并不会将其标记为停止。
TimeoutSec= #启动或者重启命令执行设定的秒数后仍未完成,判定超时,强行终止。
KillMode= #中止模式,可选process(单进程)、control-group(进程组)、none(无)
RestartSec= #重启过程中暂停多少秒

[Install]
WantedBy=multi-user.target #这个配置(unit)本身是附挂在哪一个target配置下面的
Also= #这个配置被enable的时候,也enable指定的配置
Alias= #链接别名,当enable指定服务时,则此服务会进行链接文件的创建

**其中重启选项有以下几种选择:

1. no:服务发生故障时不会自动重启。
2. always:服务发生故障时将总是自动重启。
3. on-success:只有当服务成功退出(退出状态码为0)时才会自动重启。
4. on-failure:只有当服务以失败的状态退出(退出状态码非零)时才会自动重启。
5. on-abnormal:只有当服务以异常退出的状态(例如收到了SIGSEGV、SIGABRT等信号)时才会自动重启。
6. on-watchdog:只有当由WatchdogSec选项定义的看门狗定时器超时时,才会自动重启服务。

常用命令

重载配置文件 sudo systemctl daemon-reload

启动 sudo systemctl start <service>

重启 sudo systemctl restart <service>

重载 sudo systemctl reload <service>

设置自动启动 sudo systemctl enable <service>

取消自动启动 sudo systemctl disable <service>

屏蔽和阻止启动 sudo systemctl mask <service>

参考资料

systemctl 针对 service 类型的配置文件


标题:Linux常见初始化系统SysVinit和systemd的使用(附配置文件模板)
作者:xiaojie
地址:https://xiaojie.dev/articles/2020/05/04/1692243019243.html