Linux 下设置开机自启动的方法
文章目录
- 事先准备
- 对于普通的 Linux
- 对于 RedHat Enterprise Linux 9
笔者的运行环境:
设置成功过的 Linux:
RedHat Enterprise Linux 9 x86_64
CentOS 8 x86_64
事先准备
-
进行这个教程之前,必须要先安装好一个 Linux 操作系统。这个 Linux 操作系统可以安装在虚拟机中,也可以安装在真实的电脑中。关于这方面的内容,可见笔者的其它博客:
各种操作系统安装教程大全:
https://blog.csdn.net/wangpaiblog/article/details/115436520为了方便远程输入命令、将文件加入到 Linux 操作系统中,最好还要在一台 Windows 操作系统上面使用一种终端控制软件,如 Xshell、Xftp 等。关于这方面的内容,可见笔者的另一篇博客:
如何在 Windows 主机上访问本地局域网中的 Linux 主机:
https://blog.csdn.net/wangpaiblog/article/details/120052152 -
本文主要针对一些离线免安装的应用。很多应用在安装会自动设置开机启动,对这种应用不需要设置开机启动。联网应用在启动后会占用端口号,如果想验证这种应用有没有启动,可以使用如下命令。
netstat -na | grep 该应用的端口号
如果输出了该应用的端口号被使用的信息,说明该应用已经启动。
对于普通的 Linux
-
这种方法适用于一些有 Linux 的启动目录
init.d
的 Linux。对本方法而言,读者需要先提供一种供开机启动的脚本,不妨设为myapp
。
【踩坑提醒】
此脚本中不能使用 Linux 的环境变量。Linux 的环境变量一般在文件
/etc/profile
中设置,而文件/etc/profile
是在每一个用户登录 Shell 时才会读取的。在 Linux 启动之时此文件中的环境变量不会起作用。因此,如果需要使用 Linux 的环境变量,请将环境变量直接定义在此脚本开头。
-
将此脚本移动或复制到 Linux 的启动目录
init.d
中,然后对其添加执行权限。chmod +x /etc/rc.d/init.d/myapp
-
设置
myapp
开机自启动。chkconfig myapp on
-
输入以下命令验证是否成功设置了
myapp
开机自启动:chkconfig --list
如果输出结果含
myapp
,且3、4、5
值均为开
,说明设置成功。输出如下所示:myapp 0:关 1:关 2:开 3:开 4:开 5:开 6:关
-
重启电脑试一下是否真正成功。输入以下命令重启电脑:
reboot
重启后,马上输入以下命令:
netstat -na | grep 该应用的端口号
如果输出了端口号被使用的信息,说明
myapp
开机自启动成功。
对于 RedHat Enterprise Linux 9
-
对于一些较新的 Linux,它没有提供上面的启动目录
init.d
,而是改为使用服务来启动,这样设计要规范一些。对于使用服务来启动,需要编写一个.service
文件放置在目录/etc/systemd/system
下,并使用 systemctl 命令来控制这个服务。对本方法而言,读者需要先提供一些关于应用启动、停止等命令。
-
使用如下命令在目录
/etc/systemd/system
下创建一个关于 myapp 的.service
文件。touch /etc/systemd/system/myapp.service
-
编辑该文件,在其中写入如下内容。
[Unit] Description=myapp-server After=network.target[Service] ExecStart=应用启动命令 ExecReload=应用重新加载命令 ExecStop=应用停止命令 PrivateTmp=true Type=forking[Install] WantedBy=multi-user.target
【说明】
-
对于
[Unit]
:-
Description
:描述该服务的文字说明。 -
Documentation
:关于该服务的相关文档的URL。 -
Requires
:指定该服务所依赖的其他服务,如果这些服务没有运行,那么该服务也不会启动。 -
Wants
:指定该服务所希望依赖的其他服务,但不会影响该服务的启动。 -
After
:指定该服务应在哪些其他服务启动之后再启动。 -
Before
:指定该服务应在哪些其他服务启动之前启动。 -
Conflicts
:指定该服务与哪些其他服务冲突,如果这些服务之一正在运行,那么该服务将不会启动。 -
BindsTo
:指定该服务与哪些其他服务绑定,如果这些服务之一停止运行,那么该服务也会停止。 -
PartOf
:指定该服务是哪个服务的一部分,如果该服务停止运行,那么整个服务也会停止。
-
-
对于
[Service]
:-
上面的部分以
Exec
开头属性代表着某个命令systemctl 命令关键字 myapp
。对应关系如下:-
ExecStart
:启动服务的命令,对应systemctl start myapp
-
ExecStop
:停止服务的命令,对应systemctl stop myapp
-
ExecReload
:重新加载服务的命令,对应systemctl reload myapp
重新加载服务并不是重启服务。重新加载通常用于重新加载服务的配置文件或重新加载某些资源,以便服务可以在不中断运行的情况下应用更改。
-
-
也有一些以
Exec
开头的属性需要提供相应的脚本,但它们没有对应的命令systemctl 命令关键字 myapp
。-
ExecStartPre
:在启动服务之前执行的命令。 -
ExecStartPost
:在启动服务之后执行的命令。 -
ExecStopPre
:在停止服务之前执行的命令。 -
ExecStopPost
:在停止服务之后执行的命令。
-
-
其它属性:
-
Type
:指定服务的类型,可以是simple
、forking
、oneshot
、dbus
、notify
等。 -
WorkingDirectory
:指定服务的工作目录。 -
User
:指定服务运行的用户。 -
Group
:指定服务运行的用户组。 -
Restart
:指定服务在退出后是否自动重启,可以是no
、on-success
、on-failure
、on-abnormal
、on-abort
、always
等。 -
RestartSec
:指定服务重启之间的延迟时间。 -
Environment
:指定服务的环境变量。 -
ExecStartPre
:指定在服务启动之前要执行的命令或脚本。 -
ExecStartPost
:指定在服务启动之后要执行的命令或脚本。 -
ExecStopPre
:指定在服务停止之前要执行的命令或脚本。 -
ExecStopPost
:指定在服务停止之后要执行的命令或脚本。
-
-
-
对于
[Install]
:-
WantedBy
: 指定服务所属的目标(target),即服务应该在哪个目标中启动。可以指定为一个或多个目标,多个目标之间用空格分隔。例如,WantedBy=multi-user.target
表示服务应该在multi-user.target目标中启动。 -
RequiredBy
: 指定服务所需的目标(target),即服务应该在哪个目标中必须启动。与WantedBy
类似,可以指定为一个或多个目标,多个目标之间用空格分隔。 -
Also
: 指定其他服务的安装选项。可以指定为一个或多个服务名称,多个服务之间用空格分隔。例如,Also=other.service
表示在安装当前服务时,也同时安装other.service
。
-
-
补充:
- 有些命令没有对应的属性,如
systemctl restart myapp
。该重启命令相当于停止和启动命令的组合(如果服务如果未启动会直接执行启动命令,如果已启动会先执行停止再启动)。
- 有些命令没有对应的属性,如
【注意】
-
上面的命令必需使用该命令的全路径。不能因为前面在文件
/etc/profile
设置了 myapp 的环境变量,此处命令就不使用全路径了。文件/etc/profile
是在每一个用户登录 Shell 时才会读取的。在 Linux 启动之时此文件中的环境变量不会起作用。如果想在 Linux 启动时使用环境变量,可以将此环境变量单独放入一个文件(不妨设为
/etc/systemd/system/myappenv.conf
)中,然后在本.service
文件/etc/systemd/system/myapp.service
中的[Service]
部分使用EnvironmentFile
属性导入这个环境变量配置文件。[Service] EnvironmentFile=/etc/systemd/system/myappenv.conf
-
上面的某些属性不是必要的,如果没有对应的命令,可以省略(但启动命令不能省略),但省略之后就不能使用与该属性相关联的命令。比如,如果应用没有定义重新加载命令,则属性
ExecReload
可以省略,但同时不能使用命令systemctl reload myapp
。
-
-
关闭 SELinux。这样做是为了防止服务开机自启动时发生权限不足而启动失败。关于这个报错更多的信息,可见笔者的另一篇博客:
解决RHEL服务自启动时报错service Failed to locate executable…Failed at step EXEC spawning…Permission denied:
https://blog.csdn.net/wangpaiblog/article/details/131628261关闭 SELinux 的方法是修改文件
/etc/selinux/config
,将其中的属性enforcing
由enforcing
改为disabled
。然后重启 Linux 即可。 -
依次输出以下命令设置
myapp
开机自启动:systemctl daemon-reload
systemctl enable myapp.service
-
重启电脑试一下是否真正成功。输入以下命令重启电脑:
reboot
重启后,马上输入以下命令:
netstat -na | grep 该应用的端口号
如果输出了端口号被使用的信息,说明
myapp
已经启动。
相关文章:

Linux 下设置开机自启动的方法
文章目录 事先准备对于普通的 Linux对于 RedHat Enterprise Linux 9 笔者的运行环境: 设置成功过的 Linux: RedHat Enterprise Linux 9 x86_64 CentOS 8 x86_64 事先准备 进行这个教程之前,必须要先安装好一个 Linux 操作系统。这个 Linux…...

MySQL常见问题处理(三)
MySQL 常见问题解决 夕阳留恋的不是黄昏,而是朝阳 上一章简单介绍了MySQL数据库安装(二), 如果没有看过, 请观看上一章 一. root 用户密码忘记,进行重置操作 复制内容来源链接: https://blog.csdn.net/weixin_48927364/article/details/123556927 一.…...

maven中常见问题
文章目录 一、配置项提示二、父子打包三、打包之后不显示target四、自定义打包之后的jar包名称五、整个项目打包5.1、父项目管理插件和微服务打包 一、配置项提示 SpringBoot中提示错误信息 表示的是SpringBoot中的注释提示没有配置!那么可以来使用一下springboot官…...
vue2中bus的使用
说明:为了解决组件间的通信,也就是组件与组件间的数据传递(它们之间毫无关系); 这里以组件1传递数据到组件2为例 1.首先新建一个Bus.js文件 import Vue from vue const Bus new Vue() export default Bus 2.在组件1中引用 传递数据 imp…...
实证研究在机器学习中的应用
实证研究是一种基于实际数据和事实的科学研究方法,目的是通过观察、测量、分析和解释数据来验证或否定某个假设、理论或研究问题。这种研究方法通常用于社会科学、自然科学和医学等领域。以下是实证研究的详细解释: 研究目标:实证研究旨在通过…...

IO进程线程day8(2023.8.6)
一、Xmind整理: 管道的原理: 有名管道的特点: 信号的原理: 二、课上练习: 练习1:pipe 功能:创建一个无名管道,同时打开无名管道的读写端 原型: #include <unist…...

【5G NR】逻辑信道、传输信道和物理信道的映射关系
博主未授权任何人或组织机构转载博主任何原创文章,感谢各位对原创的支持! 博主链接 本人就职于国际知名终端厂商,负责modem芯片研发。 在5G早期负责终端数据业务层、核心网相关的开发工作,目前牵头6G算力网络技术标准研究。 博客…...
tmux基础教程
tmux基础教程 Mac安装 brew install tmuxubuntu安装 sudo apt-get install tmux入门使用 会话 (Session) Ctrlb d: 分离当前会话。Ctrlb s: 列出所有会话。Ctrlb $: 重命名当前会话。 窗口(Window) Ctrlb c: 创建一个新窗口, 状态栏会显示多个窗…...

项目实战 — 消息队列(4){消息持久化}
目录 一、消息存储格式设计 🍅 1、queue_data.txt:保存消息的内容 🍅 2、queue_stat.txt:保存消息的统计信息 二、消息序列化 三、自定义异常类 四、创建MessageFileManger类 🍅 1、约定消息文件所在的目录和文件名…...

AI编程工具Copilot与Codeium的实测对比
csdn原创谢绝转载 简介 现在没有AI编程工具,效率会打一个折扣,如果还没有,赶紧装起来. GitHub Copilot是OpenAi与github等共同开发的的AI辅助编程工具,基于ChatGPT驱动,功能强大,这个没人怀疑…...

webpack基础知识六:说说webpack的热更新是如何做到的?原理是什么?
一、是什么 HMR全称 Hot Module Replacement,可以理解为模块热替换,指在应用程序运行过程中,替换、添加、删除模块,而无需重新刷新整个应用 例如,我们在应用运行过程中修改了某个模块,通过自动刷新会导致…...

Linux从安装到实战 常用命令 Bash常用功能 用户和组管理
1.0初识Linux 1.1虚拟机介绍 1.2VMware Workstation虚拟化软件 下载CentOS; 1.3远程链接Linux系统 &FinalShell 链接finalshell半天没连接进去 他说ip adress 看IP地址是在虚拟机上 win11主机是 终端输入: ifconfig VMware虚拟机的设置 & ssh连接_snge…...

webpack基础知识三:说说webpack中常见的Loader?解决了什么问题?
一、是什么 loader 用于对模块的"源代码"进行转换,在 import 或"加载"模块时预处理文件 webpack做的事情,仅仅是分析出各种模块的依赖关系,然后形成资源列表,最终打包生成到指定的文件中。如下图所示&#…...
深度学习:Pytorch常见损失函数Loss简介
深度学习:Pytorch常见损失函数Loss简介 L1 LossMSE LossSmoothL1 LossCrossEntropy LossFocal Loss 此篇博客主要对深度学习中常用的损失函数进行介绍,并结合Pytorch的函数进行分析,讲解其用法。 L1 Loss L1 Loss计算预测值和真值的平均绝对…...
【Android-java】Parcelable 是什么?
Parcelable 是 Android 中的一个接口,用于实现将对象序列化为字节流的功能,以便在不同组件之间传递。与 Java 的 Serializable 接口不同,Parcelable 的性能更高,适用于 Android 平台。 要实现 Parcelable 接口,我们需…...
Spring整合MyBatis小实例(转账功能)
实现步骤 一,引入依赖 <!--仓库--><repositories><!--spring里程碑版本的仓库--><repository><id>repository.spring.milestone</id><name>Spring Milestone Repository</name><url>https://repo.spring.i…...

List集合的对象传输的两种方式
说明:在一些特定的情况,我们需要把对象中的List集合属性存入到数据库中,之后把该字段取出来转为List集合的对象使用(如下图) 自定义对象 public class User implements Serializable {/*** ID*/private Integer id;/*…...

海外媒体发稿:软文写作方法方式?一篇好的软文理应合理规划?
不同种类的软文会有不同的方式,下面小编就来来给大家分析一下: 方法一、要选定文章的突破点: 所说突破点就是这篇文章文章软文理应以什么样的视角、什么样的见解、什么样的语言设计理念、如何文章文章的标题来写。不同种类的传播效果&#…...

【秋招】算法岗的八股文之机器学习
目录 机器学习特征工程常见的计算模型总览线性回归模型与逻辑回归模型线性回归模型逻辑回归模型区别 朴素贝叶斯分类器模型 (Naive Bayes)决策树模型随机森林模型支持向量机模型 (Support Vector Machine)K近邻模型神经网络模型卷积神经网络(CNN)循环神经…...

为什么list.sort()比Stream().sorted()更快?
真的更好吗? 先简单写个demo List<Integer> userList new ArrayList<>();Random rand new Random();for (int i 0; i < 10000 ; i) {userList.add(rand.nextInt(1000));}List<Integer> userList2 new ArrayList<>();userList2.add…...

【大模型RAG】拍照搜题技术架构速览:三层管道、两级检索、兜底大模型
摘要 拍照搜题系统采用“三层管道(多模态 OCR → 语义检索 → 答案渲染)、两级检索(倒排 BM25 向量 HNSW)并以大语言模型兜底”的整体框架: 多模态 OCR 层 将题目图片经过超分、去噪、倾斜校正后,分别用…...

2025年能源电力系统与流体力学国际会议 (EPSFD 2025)
2025年能源电力系统与流体力学国际会议(EPSFD 2025)将于本年度在美丽的杭州盛大召开。作为全球能源、电力系统以及流体力学领域的顶级盛会,EPSFD 2025旨在为来自世界各地的科学家、工程师和研究人员提供一个展示最新研究成果、分享实践经验及…...

聊聊 Pulsar:Producer 源码解析
一、前言 Apache Pulsar 是一个企业级的开源分布式消息传递平台,以其高性能、可扩展性和存储计算分离架构在消息队列和流处理领域独树一帜。在 Pulsar 的核心架构中,Producer(生产者) 是连接客户端应用与消息队列的第一步。生产者…...

Cinnamon修改面板小工具图标
Cinnamon开始菜单-CSDN博客 设置模块都是做好的,比GNOME简单得多! 在 applet.js 里增加 const Settings imports.ui.settings;this.settings new Settings.AppletSettings(this, HTYMenusonichy, instance_id); this.settings.bind(menu-icon, menu…...

pikachu靶场通关笔记22-1 SQL注入05-1-insert注入(报错法)
目录 一、SQL注入 二、insert注入 三、报错型注入 四、updatexml函数 五、源码审计 六、insert渗透实战 1、渗透准备 2、获取数据库名database 3、获取表名table 4、获取列名column 5、获取字段 本系列为通过《pikachu靶场通关笔记》的SQL注入关卡(共10关࿰…...

【开发技术】.Net使用FFmpeg视频特定帧上绘制内容
目录 一、目的 二、解决方案 2.1 什么是FFmpeg 2.2 FFmpeg主要功能 2.3 使用Xabe.FFmpeg调用FFmpeg功能 2.4 使用 FFmpeg 的 drawbox 滤镜来绘制 ROI 三、总结 一、目的 当前市场上有很多目标检测智能识别的相关算法,当前调用一个医疗行业的AI识别算法后返回…...
Web 架构之 CDN 加速原理与落地实践
文章目录 一、思维导图二、正文内容(一)CDN 基础概念1. 定义2. 组成部分 (二)CDN 加速原理1. 请求路由2. 内容缓存3. 内容更新 (三)CDN 落地实践1. 选择 CDN 服务商2. 配置 CDN3. 集成到 Web 架构 …...
JS手写代码篇----使用Promise封装AJAX请求
15、使用Promise封装AJAX请求 promise就有reject和resolve了,就不必写成功和失败的回调函数了 const BASEURL ./手写ajax/test.jsonfunction promiseAjax() {return new Promise((resolve, reject) > {const xhr new XMLHttpRequest();xhr.open("get&quo…...

uniapp 小程序 学习(一)
利用Hbuilder 创建项目 运行到内置浏览器看效果 下载微信小程序 安装到Hbuilder 下载地址 :开发者工具默认安装 设置服务端口号 在Hbuilder中设置微信小程序 配置 找到运行设置,将微信开发者工具放入到Hbuilder中, 打开后出现 如下 bug 解…...

DeepSeek源码深度解析 × 华为仓颉语言编程精粹——从MoE架构到全场景开发生态
前言 在人工智能技术飞速发展的今天,深度学习与大模型技术已成为推动行业变革的核心驱动力,而高效、灵活的开发工具与编程语言则为技术创新提供了重要支撑。本书以两大前沿技术领域为核心,系统性地呈现了两部深度技术著作的精华:…...