一、前言
想要实现程序的开机自启有很多种方案,我这里只介绍我使用过的两种方案
1.Systemd服务
systemd
是 Linux 系统中用于集中管理和服务配置的系统和服务管理器。它替代了之前的 SysV init 系统,提供了更高效的并行化启动能力,并引入了许多新特性来简化服务管理。使用 systemd
来管理服务,可以确保这些服务在系统启动时自动运行、按需启动或在故障时自动重启等。
2.profile脚本
在Ubuntu Linux系统中,/etc/profile
文件是一个Shell脚本,它在启动一个交互式的登录Shell时被读取和执行。这个文件主要用于系统范围的环境变量设置和启动程序的配置,适用于所有用户。因此,它对于需要对所有用户可用的环境变量或通用Shell配置非常有用。
二、profile脚本
这个脚本的基本用途有:环境变量设置、用户shell初始化、自定义命令执行、路劲模块初始化。
-
环境变量设置:可以在这个文件中定义系统范围的环境变量,如
PATH
、USER
、LOGNAME
、HOSTNAME
和MAIL
等。这些环境变量为所有用户会话提供默认值。 -
用户Shell初始化:当用户登录时,
/etc/profile
会被首先执行,之后才会执行用户的个人Shell初始化文件(例如.bash_profile
或.bashrc
)。这使得/etc/profile
成为了设置全局Shell环境的理想位置。 -
自定义命令执行:可以在该文件中添加任何你希望在用户登录时自动执行的命令。例如,可以设置提示符格式,显示欢迎信息等。
-
路径模块初始化:如果系统使用了类似
module
的工具来管理应用程序环境,通常也会在这里进行初始化。
使用也比较简单,直接在这个文件后面添加想要执行的命令语句,可以写入可执行程序名、脚本、命令行等语句。
脚本内容:
感兴趣的可以去研究一下脚本的功能,要是只想做开机自启动就没有必要知道原厂写的是什么意思。
使用方法:想要通过这种方法实现开机自启动程序,只需要在这个脚本后面加上你要执行的语句(要使用绝对路径)然后在加上一个&符号和|符号就可以了
注意:使用这个脚本添加自启动语句必须要加上&符号和|符号,不然文件系统会出现问题。
三、Systemd服务
Systemd服务具体是什么我就不过多介绍了直接上使用方法。
1:先到达这个服务所在的位置
路径为:
/etc/systemd/system
可以看到里面有很多.service的程序
我们所要做的就是创建一个自己的服务,也就是创建一个自己的.service程序。
2:打开创建好的服务程序编写服务代码
使用vim打开服务代码,这个可以使用AI生成一个你想要的的程序,我这里给的是一个开机自启点亮一个led灯的示例
Led灯的示范程序
[Unit]
Description=LED Control Service//简单描述服务的名字
After=network.target //这个主要是在那个服务之后启动,当前设置的为在网络模块后启动[Service]
ExecStart=/bin/bash /jcf/led.sh //设置启动的可执行程序路径
TimeoutStopSec=2
KillMode=control-group
Restart=always//总是重启
User=root//用户角色
我在网上看到别人也有介绍比较完整的例子我也一并呈现。
[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
具体使用那种根据自己的需求来进行设置。
3:使用命令操作这个服务
上面的工作只是把这个服务给写好了,但是还不能实现想要的功能
编写完服务程序后要重新加载
systemctl daemon-reload xxxx.service
启动服务
systemctl start name.service # 启动服务
关闭服务
systemctl stop name.service # 关闭服务
重启服务
systemctl restart name.service # 重启服务
开机自启服务
systemctl enable name.service # 开机自启服务
开机不自启服务
systemctl disable name.service # 开机不自启服务