ubuntu设置程序开机自启动

文章目录

1、概述

测试环境:ubuntu22.04 带图形界面

实现方式1:通过图形界面的【启动应用程序】设置开机自启动;

实现方式2:通过配置为服务实现开机自启动。

2、图形界面设置

优点:

  • 图形界面
  • 使用简单

缺点:

  • 灵活性差,如果启动有依赖或者需要实现守护进程只能通过写shell脚本实现。
  • 找到【启动应用程序】;

  • 点击【添加】,然后在【命令】栏输入需要启动的可执行程序路径,名称随便填。

  • 点击【保存】后,在系统启动后会自动启动添加的可执行程序。

  • 配置文件保存在~/.config/autostart文件夹下。

3、设置为Systemd服务

优点:

  • 功能强大,使用灵活;
  • 支持设置程序启动依赖,例如在网络准备好了后再启动;

缺点:

  • 没有图形界面,使用较为复杂;
  • 官方文档

  • 进入/etc/systemd/system文件夹;

  • 创建一个.service后缀的文件,名称自定;

  • 文件中填入启动服务的配置信息,如下所示;

shell 复制代码
[Unit]
Description=WebServer    # 简单描述服务
After=network.target     # 指定服务模块启动后再启动(网络模块启动)

[Service]
User=mhf                 # 设置服务运行的用户,带图形界面的程序最好使用普通用户运行,否则可能会启动失败,自己系统的用户名
WorkingDirectory=/home/mhf/Code/bin64      # 设置进程的工作目录
ExecStart=/home/mhf/Code/bin64/ChatServer  # 设置启动的可执行程序路径
Restart=always                             # 设置进程 退出后的重启方式 always:总是重启
RestartSec=5                               # 重启服务之前需要等待的秒数
Environment=DISPLAY=:0   # 带图形界面的程序必须指定运行桌面环境,否则会启动失败
# 环境变量 DISPLAY 告诉GUI程序如何与GUI通信。Unix系统可以运行多个X服务器,即多个显示。这些显示可以是物理显示(一个或多个监视器),或远程显示(通过网络转发,例如通过SSH),或虚拟显示,如Xvfb等。指定显示的基本语法是 HOST:NUMBER ;如果忽略 HOST 部分,则显示为本地显示。
# 显示从0开始编号,因此 :0 是启动的第一个本地显示。在典型的设置中,这是显示在计算机显示器上的内容。

[Install]
WantedBy=multi-user.target
  • 常用配置说明
cpp 复制代码
[Unit]    # 启动顺序与依赖关系。
Description:对当前服务的简单描述。
After:指定.serive在哪些服务之后进行启动;
Before:指定.serive在哪些服务之前进行启动;
除上述内容,文件中还可能出现以下内容:
Requires:指定服务依赖于哪些服务(强依赖关系,一旦所依赖服务异常,当前服务也随之停止);
Wants:指定服务依赖于哪些服务(弱依赖关系,所依赖服务异常不影响当前服务正常运行)。

[Service]   # 启动行为
Type:定义启动类型。可设置:simple,exec,forking,oneshot,dbus,notify,idle。
simple:ExecStart 字段启动的进程为该服务的主进程;
forking:ExecStart 字段的命令将以 fork() 方式启动,此时父进程将会退出,子进程将成为主进程;
ExecStart:定义启动进程时执行的命令;
ExecStop:停止服务时执行的命令;
除上述内容外,文件中还可能出现:
EnvironmentFile:环境配置文件,用来指定当前服务启动的环境变量;
ExecReload:重启服务时执行的命令;
ExecStartPre:启动服务之前执行的命令;
ExecStartPost:启动服务之后执行的命令;
ExecStopPost:停止服务之后执行的命令;
RemainAfterExit:设为yes,表示进程退出以后,服务仍然保持执行;
RestartSec:重启服务之前需要等待的秒数。
KillMode:定义 Systemd 如何停止服务,可以设置的值如下:
    control-group(默认值):当前控制组里面的所有子进程,都会被杀掉;
    process:只杀主进程;
    mixed:主进程将收到 SIGTERM 信号,子进程收到 SIGKILL 信号;
    none:没有进程会被杀掉。
Restart:定义了退出后,Systemd 的重启方式,可以设置的值如下:
    no(默认值):退出后不会重启;
    on-success:当进程正常退出时(退出状态码为0),才会重启;
    on-failure:当进程非正常退出时(退出状态码非0),包括被信号终止和超时,才会重启;
    on-abnormal:当被信号终止和超时,才会重启;
    on-abort:当收到没有捕捉到的信号终止时,才会重启;
    on-watchdog:看门狗超时退出,才会重启;
    always:总是重启。
 
[Install]  # 区块
Install一般填为WantedBy=multi-user.target,表示多用户环境下服务被启用。
  • 配置完成后加载服务配置,用于服务文件修改后的配置更新。
shell 复制代码
sudo systemctl daemon-reload 
  • 立即启动服务
shell 复制代码
sudo systemctl start <service_name>
# 例如
sudo systemctl start ChatServer.service
sudo systemctl start ChatServer
  • 停止服务
shell 复制代码
sudo systemctl stop <service_name>
# 例如
sudo systemctl stop ChatServer.service

错误信息 :如果GUI程序没设置使用普通用户启动、没有设置Environment=DISPLAY=:0就会报错

shell 复制代码
11月 25 17:48:30 mhf-virtual-machine systemd[1]: Stopped WebServer.
11月 25 17:48:30 mhf-virtual-machine systemd[1]: Started WebServer.
11月 25 17:48:30 mhf-virtual-machine ChatServer[5154]: Authorization required, but no authorization protocol specified
11月 25 17:48:30 mhf-virtual-machine ChatServer[5154]: qt.qpa.xcb: could not connect to display :0
11月 25 17:48:30 mhf-virtual-machine ChatServer[5154]: qt.qpa.plugin: Could not load the Qt platform plugin "xcb" in "" even though it was found.
11月 25 17:48:30 mhf-virtual-machine ChatServer[5154]: This application failed to start because no Qt platform plugin could be initialized.  Reinstalling the application may fix this problem.
11月 25 17:48:30 mhf-virtual-machine ChatServer[5154]: Available platform plugins are: eglfs, linuxfb, minimal, minimalegl, offscreen, vnc, wayland-egl, wayland, wayland-xcomposite-egl, wayland-xcomposite-glx, webgl, xcb.
11月 25 17:48:30 mhf-virtual-machine systemd[1]: ChatServer. service: Main process exited, code=dumped, status=6/ABRT
11月 25 17:48:30 mhf-virtual-machine systemd[1]: ChatServer. service: Failed with result 'core-dump'.
相关推荐
物联网老王2 小时前
Ubuntu Linux Cursor 安装与使用一
linux·运维·ubuntu
计算机毕设定制辅导-无忧学长4 小时前
西门子 PLC 与 Modbus 集成:S7-1500 RTU/TCP 配置指南(一)
服务器·数据库·tcp/ip
cv高级工程师YKY8 小时前
SRE - - PV、UV、VV、IP详解及区别
大数据·服务器·uv
眠修8 小时前
Kuberrnetes 服务发布
linux·运维·服务器
BAOYUCompany9 小时前
暴雨服务器成功中标华中科技大学集成电路学院服务器采购项目
运维·服务器
鳄鱼皮坡11 小时前
仿muduo库One Thread One Loop式主从Reactor模型实现高并发服务器
运维·服务器
fangeqin11 小时前
ubuntu源码安装python3.13遇到Could not build the ssl module!解决方法
linux·python·ubuntu·openssl
小Mie不吃饭11 小时前
FastAPI 小白教程:从入门级到实战(源码教程)
运维·服务器
爱奥尼欧12 小时前
【Linux 系统】基础IO——Linux中对文件的理解
linux·服务器·microsoft
戒不掉的伤怀13 小时前
【Navicat 连接MySQL时出现错误1251:客户端不支持服务器请求的身份验证协议;请考虑升级MySQL客户端】
服务器·数据库·mysql