文章目录
- Ubuntu服务设置开机自启
- [1. 设置systemd 服务](#1. 设置systemd 服务)
-
- [1.1 创建服务文件](#1.1 创建服务文件)
- [1.2 编辑.service文件内容](#1.2 编辑.service文件内容)
- [1.3 操作服务相关指令](#1.3 操作服务相关指令)
- [1.4 服务状态查询](#1.4 服务状态查询)
- [1.5 服务启动失败原因](#1.5 服务启动失败原因)
- [1.6 systemd支持的时间单位](#1.6 systemd支持的时间单位)
- [2. 查询程序是否启动](#2. 查询程序是否启动)
-
- [2.1 通过ps命令查询](#2.1 通过ps命令查询)
- [2.2 通过程序端口查询(如含web服务)](#2.2 通过程序端口查询(如含web服务))
- [2.3 通过程序的api测试(如含API)](#2.3 通过程序的api测试(如含API))
- [3. 比较不同的设置ubuntu程序开机自启的方式](#3. 比较不同的设置ubuntu程序开机自启的方式)
-
- [3.1 systemd服务](#3.1 systemd服务)
- [3.2 Startup Applications](#3.2 Startup Applications)
- [3.3 rc.local](#3.3 rc.local)
- [3.4 .bashrc](#3.4 .bashrc)
Ubuntu服务设置开机自启
1. 设置systemd 服务
1.1 创建服务文件
bash
sudo nano /etc/systemd/system/Detection.service
1.2 编辑.service文件内容
bash
[Unit]
Description=Detection
After=network.target
[Service]
ExecStartPre=/bin/sleep 10 # 等待相机驱动加载
WorkingDirectory=/home/demo/code/item/code/bin
ExecStart=/home/demo/code/item/code/bin/Detection
Restart=always # 任何情况下退出都重启(包括正常退出),除非被 systemctl stop 明确停止
RestartSec=10s # 失败后等待20秒再重启
StartLimitInterval=60s #时间窗口
StartLimitBurst=5 # 在这个窗口内最多允许启动5次
# 如果60秒内重启超过5次,systemd会停止重启尝试,服务会进入"失败"状态,需要手动干预 (安全机制,防止问题服务消耗系统资源)
# 超过60秒窗口后,计数器会重置
User=demo
[Install]
WantedBy=multi-user.target
- Restart参数
bash
Restart=on-failure # 失败后重启(非正常退出) 适合"任务型"服务,完成任务就结束
Restart=on-abnormal # 异常退出或被信号终止时重启
Restart=on-watchdog # watchdog超时时重启
Restart=on-abort # 仅程序崩溃时重启
1.3 操作服务相关指令
bash
# 启用服务
sudo systemctl enable Detection.service
# 启动服务
sudo systemctl start Detection.service
# 停止服务
sudo systemctl stop Detection.service
# 重启服务 - 会先停止再启动服务
sudo systemctl restart Detection.service
# 禁用开机自启
sudo systemctl disable Detection.service
# 查看服务状态
sudo systemctl status Detection.service
# 重新加载配置 - 修改了服务配置后的操作
sudo systemctl daemon-reload
# 重置失败计数器
sudo systemctl reset-failed Detection.service
# 重启服务
sudo systemctl restart Detection.service
# 查看服务日志
sudo journalctl -u Detection.service
# 查看服务实时日志
sudo journalctl -u Detection.service -f
# 检查是否已启用开机自启
systemctl is-enabled Detection.service
1.4 服务状态查询
bash
# 成功示例
demo@demo-O-E-M:/etc/systemd/system$ sudo systemctl status Detection.service
● Detection.service - Detection
Loaded: loaded (/etc/systemd/system/Detection.service; enabled; preset: enabled)
Active: active (running) since Wed 2026-01-28 14:16:21 CST; 6s ago
Main PID: 18414 (Detectio)
Tasks: 12 (limit: 38026)
Memory: 186.8M (peak: 188.0M)
CPU: 99ms
CGroup: /system.slice/Detection.service
└─18414 /home/demo/code/item/code/bin/Detection
lines 1-10
1.5 服务启动失败原因
bash
# 失败示例
demo@demo-O-E-M:/etc/systemd/system$ sudo systemctl status Detection.service
× Detection.service - Detection
Loaded: loaded (/etc/systemd/system/Detection.service; enabled; preset: enabled)
Active: failed (Result: exit-code) since Wed 2026-01-28 14:09:37 CST; 1min 22s ago
Duration: 886us
Process: 17445 ExecStart=/home/demo/code/item/code/bin/Detection(code=exited, status=217/USER)
Main PID: 17445 (code=exited, status=217/USER)
CPU: 559us
1月 28 14:09:37 demo-O-E-M systemd[1]: Detection.service: Scheduled restart job, restart counter is at 5.
1月 28 14:09:37 demo-O-E-M systemd[1]: Detection.service: Start request repeated too quickly.
1月 28 14:09:37 demo-O-E-M systemd[1]: Detection.service: Failed with result 'exit-code'.
1月 28 14:09:37 demo-O-E-M systemd[1]: Failed to start Detection.service - Detection.
- 可能存在的原因以及解决方法
-
status=217/USER:表示服务指定的用户不存在或没有权限执行该程序,需修改.service文件里的User=demo配置 -
程序文件没有执行权限,需给可执行文件赋予权限
bash# 给程序添加执行权限 sudo chmod +x /home/demo/code/item/code/bin/Detection # 检查文件所有权 sudo chown demo:demo /home/demo/code/item/code/bin/Detection -
程序运行依赖工作目录设置问题,需修改.service文件里的
WorkingDirectory=配置设置正确的目录
1.6 systemd支持的时间单位
| 单位缩写 | 完整形式 | 示例 | 含义 |
|---|---|---|---|
| s | sec, second, seconds | 10s | 10秒 |
| m | min, minute, minutes | 5m | 5分钟 |
| h | hr, hour, hours | 2h | 2小时 |
| d | day, days | 1d | 1天 |
| ms | msec, millisecond | 500ms | 500毫秒 |
| us | usec, microsecond | 100us | 100微秒 |
-
注意事项
- 支持上述所有单位缩写和完整形式
- 如果没有指定单位,默认单位是秒
- 数字与时间之间不允许存在空格
- 单位不区分大小写,但推荐使用小写(s而不是S)
- 时间不需要加引号,如"10s"
-
时间等价示例
bash
RestartSec=10 # 默认单位为秒
RestartSec=10s # 明确指定秒
RestartSec=10sec # 完整拼写
RestartSec=10seconds # 完整复数形式
-
混合单位
- RestartSec=2min 30s # 2分30秒
- RestartSec=1h 30min # 1小时30分钟
-
查询systemd 如何解析配置
bash
# 查看服务的时间配置(以微秒显示)
sudo systemctl show Detection.service | grep -i restart
# 或者更精确查看
sudo systemctl show Detection.service -p RestartUSec
2. 查询程序是否启动
2.1 通过ps命令查询
bash
ps -ef | grep Detection
ps -aux | grep Detection
2.2 通过程序端口查询(如含web服务)
bash
# 检查端口监听
sudo netstat -tlnp | grep 65432
2.3 通过程序的api测试(如含API)
http://127.0.0.1:65432/visiual/application/getApplicationStatus
3. 比较不同的设置ubuntu程序开机自启的方式
3.1 systemd服务
- 使用方法
- 上方已述
- 适用场景
- 后台守护进程
- web服务/API服务
- 需要全天候运行的服务
- 需要监控和自动重启的服务
- 特点
- 功能强大:可以设置依赖关系(如 网络就绪后启动) 资源限制、自动重启、日志管理
- 可靠性高:systemd会监控服务进程,如果服务崩溃会自动重启
- 标准化:是大多数Linux发行版的标准服务管理方式
- 系统启动时启动
3.2 Startup Applications
- 使用方法
- 桌面环境提供的功能,在用户登录桌面后启动一些应用程序
- 通过在
~/.config/autostart/目录下创建 .desktop 文件来实现
- 适用场景
- 桌面应用程序(带图形界面的软件)
- 不适用于服务器环境(无图形界面)
- 特点:
- 交互友好:图形界面设置较为直观
- 用户会话相关:只有在用户登录桌面后才以该用户的权限启动
- 依赖于桌面环境,如果纯命令行模式无法使用
3.3 rc.local
- 使用方法
- 将需要开机时运行的程序 写入
/etc/rc.local文件
- 将需要开机时运行的程序 写入
- 适用场景
- 简单的启动任务:如挂载磁盘、设置静态路由(等系统初始化脚本)
- 传统系统或需要兼容旧式启动脚本的环境
- 特点
- 简单:只需要将命令写入
/etc/rc.local文件 - 系统级:系统启动的最后阶段(在切换到多用户运行级别后),以root权限执行
- 逐渐被淘汰:新Linux发行版已不在默认包含rc.local,需手动启用
- 无进程监控,启动顺序难以控制
- 简单:只需要将命令写入
3.4 .bashrc
- 使用方法
- 将命令写入
~/.bashrc,每次启动交互式 Bash shell 时,都会执行~/.bashrc里的命令
- 将命令写入
- 适用场景
- 设置用户环境变量、别名、函数等
- 每次打开终端时需执行的命令
- 不适用于需长时间运行的服务
- 特点
- 用户级别:只对当前用户有效,并且只在打开终端时执行
- 不适用后台服务,如果程序需一直运行,那么关闭终端后会被中国乃至(除非适用nohup或&等方式放到后台,但管理不便)
- 不适合开机自启:需用户登录并启动shell才执行