对于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 秒出现一行时间记录。
注意
权限问题:
- 服务文件权限需为
644(sudo 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 查看详细报错日志,是排查问题的核心方法。