Ubuntu服务设置开机自启

文章目录

  • 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.
  • 可能存在的原因以及解决方法
  1. status=217/USER:表示服务指定的用户不存在或没有权限执行该程序,需修改.service文件里的User=demo 配置

  2. 程序文件没有执行权限,需给可执行文件赋予权限

    bash 复制代码
    # 给程序添加执行权限
    sudo chmod +x /home/demo/code/item/code/bin/Detection
    # 检查文件所有权
    sudo chown demo:demo /home/demo/code/item/code/bin/Detection
  3. 程序运行依赖工作目录设置问题,需修改.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才执行
相关推荐
BestOrNothing_20151 小时前
(1)双系统中Ubuntu22.04启动盘制作与启动盘恢复全过程
linux·ubuntu·双系统·启动盘制作·启动盘恢复
AI成长日志2 小时前
【实用工具教程】Linux常用命令速查与实战场景:文件操作、进程管理与网络调试高频命令解析
linux·php
落叶花开又一年2 小时前
检验检测机构资质认定远程评审工作程序
linux·运维·服务器
wanhengidc2 小时前
《三国志异闻录》搬砖新游戏 云手机
运维·服务器·数据库·游戏·智能手机
idolao2 小时前
CentOS 7 安装 jdk-7u25-linux-x64.tar.gz 详细步骤(解压配置环境变量)
linux
i建模2 小时前
通过命令行使用密钥登录远程SSH主机
运维·ssh
旺仔.2912 小时前
僵死进程及Linux文件操作 详解
linux·运维·服务器
IMPYLH3 小时前
Linux 的 comm 命令
linux·运维·算法
淡泊if3 小时前
1.2GB → 98MB,我的 Docker 镜像瘦身实战记录
运维·docker·容器