Linux系统创建自启动服务
2026/6/18 11:54:39 网站建设 项目流程

一、 Systemd 服务目录

(1)传统/etc/init.d/内写入的是脚本文件,现代化的都是XXX.service 文件。

(2)个人写的子系统服务,建议放在/etc/systemd/system/目录下,

目录用途优先级
/etc/systemd/system/管理员自定义/覆盖服务最高
/run/systemd/system/运行时临时服务(重启丢失)中等
/lib/systemd/system/系统包安装的默认服务最低
~/.config/systemd/user/用户级,仅当前用户最低
/etc/init.d/系统级(传统方式)、传统脚本

二、文件写入内容

位置:/etc/systemd/system/MyTsk.service

Restart=on-failure:这样可以实现关闭程序,它又自己启动,也就是系统发现该进程关闭了,又会重新启动该进程。

kickpi@kickpi:/etc/systemd/system$ cat MyTsk.service [Unit] Description=My TSK Application Service # 依赖网络+图形界面启动完成再运行 After=network.target graphical.target # 强制要求图形目标,否则不启动 Requires=graphical.target [Service] Type=simple User=kickpi Group=kickpi WorkingDirectory=/home/kickpi Environment="LD_LIBRARY_PATH=/opt/prefix/lib" Environment="DISPLAY=:0" # 预等待缩短,超时拉长,避免卡死 #ExecStartPre=/bin/sleep 15 ExecStart=/bin/bash /home/kickpi/Run_app.sh #关闭后启动 Restart=on-failure RestartSec=10 TimeoutStartSec=90 StandardOutput=journal StandardError=journal [Install] # 关键:改为图形目标开机自启 WantedBy=graphical.target

/home/kickpi/Run_app.sh是个脚本文件,内容如下:

/home/kickpi/appTSK_SWZF是qt程序;cronolog 是每天创建日志的命令。

kickpi@kickpi:/etc/systemd/system$ cat -n /home/kickpi/Run_app.sh 1 #!/bin/bash 2 #sudo apt update 3 #sudo apt install -y cronolog 4 export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/opt/prefix/lib 5 /home/kickpi/appTSK_SWZF -platform xcb 2>&1 | cronolog /home/kickpi/tsk_all_file/runlog/tsk_%Y-%m-%d.log

三、服务命令

构建服务程序systemctl命令步骤:

1、修改XXX.service文件后执行 sudo systemctl daemon-reload // 重新加载 systemd(让系统识别新服务) sudo systemctl start myapp //重新加载启动服务 sudo systemctl status myapp //服务状态查看 sudo systemctl enable myapp //设置开机自启动 sudo systemctl is-enabled MyTsk /验证是否已启用 # 应该输出:enabled sudo systemctl status MyTsk # 查看服务状态 # Loaded 行应该显示:enabled 2、修改了 [Install] 部分执行,例如: 从 WantedBy=graphical.target 改为 WantedBy=multi-user.target sudo systemctl reenable MyTsk.service 3、重启进程执行 # 重置失败状态 sudo systemctl reset-failed MyTsk.service # 重新启动 sudo systemctl start MyTsk.service # 查看运行状态 sudo systemctl status MyTsk.service

其它命令如下:

sudo systemctl start 服务名 # 启动服务 sudo systemctl stop 服务名 # 停止服务 sudo systemctl restart 服务名 # 重启服务 sudo systemctl reload 服务名 # 重新加载配置(不中断服务) systemctl status 服务名 # 查看服务状态 systemctl is-active 服务名 # 查看服务是否运行中 sudo systemctl enable 服务名 # 启用开机自启动 sudo systemctl disable 服务名 # 禁用开机自启动 systemctl is-enabled 服务名 # 查看是否已启用开机自启动 systemctl list-unit-files --state=enabled # 查看所有已启用的服务 systemctl list-units --type=service # 查看所有正在运行的服务 systemctl list-units --type=service --all # 查看所有服务(包括未运行的) systemctl show --property=UserspaceTimestamp # 查看系统启动时间 systemctl get-default # 查看系统当前运行级别

四、加载地址查看

查看系统服务ssh 的加载地址是/etc/systemd/system/MyTsk.service:

Loaded: loaded (/etc/systemd/system/MyTsk.service; enabled; vendor preset: enabled)

这个是个qt图形界面程序,开机自启动正常运行了。

五、附录

上述可以实现开机自启动qt程序,但是它启动的时机是桌面显示成功后,再自启动qt程序。
说人话就是先显示桌面,然后启动预定的程序。

守护进程查看: kickpi@kickpi:~$ ls -l /proc/2433/fd/0 lr-x------ 1 kickpi kickpi 64 Jun 18 09:27 /proc/2433/fd/0 -> /dev/null kickpi@kickpi:~$ ps -o ppid= -p 2433 1 kickpi@kickpi:~$ ps -o sid= -p 2433 2433

解读:

  • 2433(bash 守护脚本)→ 子进程 2441(业务 appTSK_SWZF)、2442(cronolog 日志工具)
  • cronolog 负责接收业务程序 stdout/stderr,自动按日期切割落地日志到/home/kickpi/tsk_all_file/runlog/

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询