对于systemctl指令

对于systemctl指令

常用的

#查看服务当前状态
systemctl status <服务名>

#启动指定服务
systemctl start <服务名>

#停止指定服务
systemctl stop <服务名>

#重启指定服务(先停后启)
systemctl restart <服务名>

#重新加载服务配置(不停止服务)
systemctl reload <服务名>

#设置服务开机自启
systemctl enable <服务名>

#关闭服务开机自启
systemctl disable <服务名>

基础的

#列出所有正在运行的服务
systemctl list-units --type=service

#列出所有服务(包括停止的)
systemctl list-units --type=service --all

#重载 systemd 配置(修改服务配置文件后需执行)
systemctl daemon-reload

使用systemctl,自己写一个

1、自己先写一共脚本,例如创建一个/usr/local/bin/myapp.sh脚本文件

#!/bin/bash
# 示例脚本:每隔10秒向日志文件写入当前时间
while true; do
echo "MyApp running at: $(date)" >> /var/log/myapp.log
sleep 10
done

2、给其执行权限

sudo chmod +x /usr/local/bin/myapp.sh

3、编写systemctl文件

创建一共systemctl文件,/etc/systemd/system/myapp.service,必须service为后缀,写入并给644权限

[Unit]
# 服务描述(自定义)
Description=My Custom Application Service
# 服务启动依赖(网络就绪后启动)
After=network.target

[Service]
# 运行用户(推荐用非root用户,如ubuntu、www-data,这里先以root为例)
User=root
# 运行组
Group=root
# 服务类型:simple 表示直接运行ExecStart指定的程序(最常用)
Type=simple
# 核心:要执行的程序/脚本路径
ExecStart=/usr/local/bin/myapp.sh
# 停止服务时执行的命令(可选)
ExecStop=/bin/kill -TERM $MAINPID
# 程序崩溃后自动重启(关键,保证服务稳定性)
Restart=on-failure
# 重启间隔(可选)
RestartSec=5
# 日志输出重定向(可选,方便排查问题)
StandardOutput=append:/var/log/myapp.log
StandardError=append:/var/log/myapp.log

[Install]
# 开机自启的目标(多用户模式,最常用)
WantedBy=multi-user.target

4、重载 systemd 配置

sudo systemctl daemon-reload

5、测试

# 启动服务
sudo systemctl start myapp.service

# 查看服务状态(检查是否运行正常)
sudo systemctl status myapp.service

# 验证日志(看脚本是否正常输出)
tail -f /var/log/myapp.log

正常状态输出会显示 Active: active (running),日志会每隔 10 秒出现一行时间记录。

注意

权限问题

  • 服务文件权限需为 644sudo chmod 644 /etc/systemd/system/myapp.service),否则 systemd 无法识别;
  • 尽量避免用 root 用户运行服务,创建普通用户(如 myapp)并修改 User=myapp 更安全。

路径问题

  • ExecStart 必须用绝对路径(如 /usr/local/bin/myapp.sh),不能用相对路径(如 ./myapp.sh)。

后台运行程序

  • 如果你的程序本身是后台运行的(如带 & 或自身会 fork 进程),需将 Type 改为 forking,并确保程序能正确生成 PID 文件。

日志排查

  • 服务启动失败时,用 journalctl -u myapp.service -f 查看详细报错日志,是排查问题的核心方法。