AlexRomeo
发布于 2024-04-25 / 47 阅读
0
0

Linux系统-Systemd服务

systemd服务自定义启动

Systemd 是 CentOS 7 中用于初始化系统的系统和服务管理器,可以让你将脚本设置为服务来管理。

脚本内容:

#!/bin/bash
# Loading System Environment Variables
source /etc/profile
# 以日期时间为后缀,每次运行都生成新的日志文件
LOG_FILE="magic_api_$(date '+%Y%m%d_%H%M%S').log"

# magic Jar package
path1=/root

# Log path
logpath=/root/magic-log

java -jar $path1/Magic_API.jar >> "$logpath/$LOG_FILE" 2>&1

# 获取后台运行的最后一个进程的 PID
PID=$!
echo "启动进程 PID: $PID"

# 给 Java 应用一点时间启动
sleep 10

# 检查进程是否还在运行
if kill -0 $PID 2>/dev/null; then
  echo "启动成功"
else
  echo "启动失败,查看日志文件 $logpath/$LOG_FILE"
fi

服务文件

首先,需要创建一个 systemd 服务文件。通常这个文件应该放在 /etc/systemd/system/ 目录下。例如,可以创建一个名为 your-service.service 的文件:

sudo vi /etc/systemd/system/your-service.service

在该文件中添加如下内容:

[Unit]
Description=My Custom Startup Script

[Service]
Type=simple
ExecStart=/path/to/your/script.sh
Restart=on-abort

[Install]
WantedBy=multi-user.target

创建systemd服务

创建magicapi.service文件,内容如下:

[Unit]
Description=MagicAPI Service

[Service]
Type=simple
ExecStart=/root/start_magicserver.sh
Restart=on-abort

[Install]
WantedBy=multi-user.target

使用systemd服务

在正式自己创建的服务器之前,需要执行命令将配置文件加载到systemd中。

systemctl daemon-reload

然后自己编写的服务就可以像系统其他的服务一样使用start、stop、status、restart等服务。

systemctl start magicapi.service
systemctl stop magicapi.service
systemctl status magicapi.service
systemctl restart magicapi.service

也可以通过enable或disable将服务开机启动或开机禁用。

systemctl enable magicapi.service
systemctl disable magicapi.service

关键内容解释

[Unit] 部分

  • [Unit]: 这一行标记着单元配置文件的开始。在 systemd 中,单元(unit)是对系统资源的一个抽象,用于管理服务、挂载点、设备等。
  • Description=Start MagicAPI Service: 这行提供了对这个服务单元的简短描述。这里描述的是 "Start MagicAPI Service",这说明该服务的目的是启动 MagicAPI 服务。这个描述会在系统管理工具中显示,帮助用户识别服务的功能。

[Service] 部分

  • [Service]: 这一行标记着服务类型的配置部分的开始。这里定义的是与服务特定行为相关的配置。
  • Type=simple: 这行指定了服务的启动类型为 simple。这是 systemd 服务类型的默认值,意味着 systemd 认为该服务将立即启动并且一直运行。ExecStart 指定的程序被认为是服务的主进程,如果此程序退出,服务被认为已停止。
  • ExecStart=/root/start_magicserver.sh: 这行定义了启动服务时执行的命令或脚本。此例中,当服务启动时,系统将运行位于 /root/start_magicserver.sh 的脚本。这个脚本应该包含启动 MagicAPI 服务所需的所有命令。
  • Restart=on-abort: 这行指定了服务重启的策略。on-abort 表示只有在服务因异常终止(比如进程被信号杀死)时才会重新启动。这有助于确保在非正常终止的情况下服务能自动尝试恢复。

[Install] 部分

  • [Install]: 这一行标记着与服务安装相关的指令的开始。这部分主要定义了当通过 systemctl enable 命令使服务自启动时应该怎么做。
  • WantedBy=multi-user.target: 这行指定了服务安装时应该被哪个目标(target)所需要。multi-user.target 是一个系统运行级别,类似于传统的运行级别 3,意味着在多用户文本模式下运行。在这里,WantedBy=multi-user.target 意味着当系统达到多用户目标状态时,这个服务应该被启动。

总的来说,这个 systemd 服务单元文件配置了一个名为 "MagicAPI" 的服务,这个服务在系统启动到多用户模式时自动启动,并且在由于异常原因导致服务终止时自动重启。它通过运行一个位于 /root/start_magicserver.sh 的脚本来启动 MagicAPI 服务。

前端程序示例

Vue前端编写的程序如果希望通过systemd服务来管理的话,还需要指定下前端程序的工作空间,否则访问的时候会出现“Cannot GET /”

启动Vue的shell脚本编写如下:

# cat /root/vue_operation.sh
#!/bin/bash

# 前端程序启动脚本
path="/opt/software/Vue"
/opt/software/node-v14.17.4-linux-x64/bin/node $path/server.js

编写systemd服务

# cat /etc/systemd/system/vue.service 
[Unit]
Description=Vue Frontend Server
After=network.target

[Service]
Type=simple
WorkingDirectory=/opt/software/Vue/
ExecStart=/bin/bash /root/vue_operation.sh
Restart=on-abort

[Install]
WantedBy=multi-user.target

关键内容解释

[Unit] 部分

[Unit]
Description=Vue Frontend Server
After=network.target
  • Description=Vue Frontend Server:这一行定义了服务的描述,说明了这个服务是用来运行 Vue 前端服务器的。
  • After=network.target:这一行指定服务应该在网络服务 (network.target) 启动后才启动。这确保了网络已经准备就绪,以便服务能够正常工作。

[Service] 部分

[Service]
Type=simple
WorkingDirectory=/opt/software/Vue/
ExecStart=/bin/bash /root/vue_operation.sh
Restart=on-abort
  • Type=simple:指定服务以简单的方式运行。这意味着 systemd 会认为启动服务后,该服务的主进程直接由 ExecStart 指定的命令启动,并且不会在后台生成其他额外的子进程。
  • WorkingDirectory=/opt/software/Vue/:指定服务的工作目录是 /opt/software/Vue/。这是服务启动后的工作路径,也就是 vue_operation.sh 脚本将在这个目录下执行。
  • ExecStart=/bin/bash /root/vue_operation.sh:这一行定义了服务启动时要执行的命令。具体来说,它调用了 /bin/bash 解释器来执行 /root/vue_operation.sh 脚本。这意味着在启动服务时,将会执行这个脚本来启动 Vue 前端服务器。
  • Restart=on-abort:指定服务在异常终止时(非正常退出)应该自动重启。on-abort 选项告诉 systemd,在服务由于异常情况(如程序崩溃或收到不可恢复的信号)而终止时,应该自动重新启动该服务,以确保服务的可用性。

[Install] 部分

[Install]
WantedBy=multi-user.target
  • WantedBy=multi-user.target:这一行指定了当系统运行级别达到 multi-user.target 时,应该启用这个服务。multi-user.target 是系统启动时的一个目标,表示系统已经进入了多用户模式,可以运行多个用户服务。

评论