当前位置: 首页 > news >正文

linux设置常见开机自启动命令(一)

本文介绍了三种开机自启的方式,重点介绍使用systemctl的方式自启动的

方法一:使用 systemd 服务(推荐)

本方法仅适用于 systemd 系统。如何区分是不是 systemd 系统?很简单,只需运行ps aux命令,查看 pid 为 1 的进程是不是 systemd

如果用户需要,可以将服务配置文件手动存放至用户配置目录/etc/systemd/system下。该目录下的服务配置文件可以是普通.service文件,也可以是链接至/usr/lib/systemd/system目录下服务配置文件的软链接

为了实现目的,我们需要创建一个 systemd 启动服务,并把它放置在/usr/lib/systemd/system/下,并在/etc/systemd/system/目录创建链接文件(lrwxrwxrwx中的l表示链接文件,类似windows中的快捷方式;-代表普通文件;d表示为目录文件)指向源文件或者直接/etc/systemd/system/下创建.service文件

使用ln -s命令来创建一个软链接文件,语法为ln -s <目标文件> <链接文件路径>

例如:ln -s /usr/lib/systemd/system/nginx.service /etc/systemd/system/nginx.service

我们创建的 systemd 启动服务如下。请注意,这时后缀是.service

一个.service配置文件分为三部分

  • Unit:定义该服务作为Unit角色时相关的属性
  • Service:定义本服务相关的属性
  • Install:定义本服务在设置服务开机自启动时相关的属性。换句话说,只有在创建/移除服务配置文件的软链接时,Install段才会派上用场。这一配置段不是必须的,当未配置[Install]时,设置开机自启动或禁止开机自启动的操作将无任何效果

[Unit][Install]段的配置指令都来自于man systemd.unit,这些指令都用于描述作为Unit时的属性,[Service]段则专属于.Service服务配置文件。详见:https://juejin.cn/post/7401066742070837260

DescriptionUnit的描述信息
Documentation本Unit的man文档路径
After本服务在哪些服务启动之后启动,仅定义启动顺序,不定义服务依赖关系,即使要求先启动的服务启动失败,本服务也依然会启动
Before本服务在哪些服务启动之前启动,仅定义启动顺序,不定义服务依赖关系。通常用于定义在关机前要关闭的服务,如Before=shutdown.target
Wants

本服务在哪些服务启动之后启动,定义服务依赖关系,不定义服务启动顺序。启动本服务时,如果被依赖服务未启动,则也会启动被依赖服务。如果被依赖服务启动失败,本服务不会受之影响,因此本服务会继续启动。如果未结合After使用,则本服务和被依赖服务同时启动。 当配置在[Install]段落中时,systemctl enable操作将会将本服务安装到对应的.wants目录下(在该目录下创建一个软链接),在开机自启动时,.wants目录中的服务会被隐式添加至目标Unit的Wants指令后。

DescriptionService的描述信息
PIDFilepid文件路径
ExecStart指定启动单元的命令或者脚本
ExecStartPre和ExecStartPost在ExecStart之前或者之后用户自定义执行的脚本
ExecReload单元重启时执行的命令或者脚本
ExecStop单元停止时执行的命令或者脚本
PrivateTmpTrue表示给服务分配独立的临时空间
Restart这个选项如果被允许,服务重启的时候进程会退出,会通过systemctl命令执行清除并重启的操作
User字段可以设置服务的用户名
Group字段可以设置服务的用户组
WorkingDirectory字段指定服务的安装目录
DescriptionInstall的描述信息
WantedBy本服务设置开机自启动时,在被依赖目标的.wants目录下创建本服务的软链接。例如WantedBy = multi-user.target时,将在/etc/systemd/multi-user.target.wants目录下创建本服务的软链接。
RequiredBy类似WantedBy,但是是在.requires目录下创建软链接。

例如:nginx.service

[Unit] Description=nginx - high performance web server Documentation=http://nginx.org/en/docs/ After=network-online.target remote-fs.target nss-lookup.target Wants=network-online.target [Service] Type=forking PIDFile=/var/run/nginx.pid #指定nginx.pid的生成位置,需要在nginx.conf配置文件中配置,此文件没有回判断服务启动失败 ExecStart=/usr/local/nginx/sbin/nginx -c /usr/local/nginx/nginx.conf ExecReload=/bin/kill -s HUP $MAINPID ExecStop=/bin/kill -s TERM $MAINPID [Install] WantedBy=multi-user.target

.service文件中各个字段含义如下

[Unit] Description=demo #当前配置文件的描述信息 After=network.target nginx.service #表示当前服务是在那个服务后面启动,一般定义为网络服务启动后启动 [Service] WorkingDirectory=/home/test #工作目录 Type=forking #定义启动类型 ExecStart=/home/test/demo-start.sh #定义启动进程时执行的命令。 ExecReload=/home/test/demo-restart.sh #重启服务时执行的命令 ExecStop=/home/test/demo-stop.sh #定义关闭进程时执行的命令。 PrivateTmp=true #是否分配独立空间 Restart=always RestartSec=5 StartLimitInterval=0 StartLimitBurst=5 [Install] WantedBy=multi-user.target #表示多用户命令行状态

之后我们再运行下面两条命令来更新 systemd 配置文件,并启动服务。

$ systemctl daemon-reload $ systemctl enable nginx.service

通过命名,查看所有的启动服务及状态

systemctl list-unit-files --type=service

附属一些自启动文件:

zookeeper的自启动文件

[Unit] Description=zookeeper.service Requires=network.target After=network.target [Service] Type=forking User=zookeeper Group=zookeeper Restart=on-failure RestartSec=3 TimeoutStartSec=1min PIDFILE=/zookeeper_data/2181/data/zookeeper_server.pid Environment=JAVA_HOME=/usr/java/jdk1.8.0_191 Environment=ZOO_LOG_DIR=/opt/log/middleware/zookeeper Environment=ZOO_LOG4J_PROP=INFO,ROLLINGFILE Environment=CONF="/zookeeper_data/2181/zoo.cfg" ExecStart=/usr/local/zookeeper/bin/zkServer.sh start $CONF ExecStop=/usr/local/zookeeper/bin/zkServer.sh stop $CONF [Install] WantedBy=multi-user.target

kafka的自启动文件

[Unit] Description=Kafka Daemon After=zookeeper.service [Service] Type=simple User=kafka Group=kafka LimitNOFILE=50000 Restart=on-failure RestartSec=3 TimeoutStartSec=1min Environment=JAVA_HOME=/usr/java/jdk1.8.0_191 Environment="LOG_DIR=/opt/log/middleware/kafka" Environment="KAFKA_LOG4J_OPTS=-Dlog4j.configuration=file:/usr/local/kafka/config/log4j.properties" Environment="KAFKA_HEAP_OPTS=-Xmx1G -Xms1G" Environment=JMX_PORT=9192 ExecStart=/usr/local/kafka/bin/kafka-server-start.sh "/usr/local/kafka/config/server.properties" ExecStop=/usr/local/kafka/bin/kafka-server-stop.sh "/usr/local/kafka/config/server.properties" [Install] WantedBy=multi-user.target

Redis的自启动配置文件

[Unit] After=network.target Description=Advanced key-value store Documentation=http://redis.io/documentation [Service] Type=forking ExecStart=/usr/local/redis/bin/redis-server /redis_data/6379/redis.conf ExecStop=/bin/kill -s TERM $MAINPID PIDFile=/redis_data/6379/redis.pid TimeoutStopSec=0 Restart=always User=redis Group=redis LimitNOFILE=65535 [Install] WantedBy=multi-user.target

方式二、修改 /etc/rc.d/rc.local 文件

/etc/rc.d/rc.local文件会在 Linux 系统各项服务都启动完毕之后再被运行。所以你想要自己的脚本在开机后被运行的话,可以将自己脚本路径加到该文件里。但是,首先需要确认你有运行这个文件的权限。

$ chmod +x /etc/rc.d/rc.local

为了演示,我们创建了一个脚本,当它被执行之后,将在home目录下写入有指定信息的output.txt文件。

$ vim auto_run_script.sh #!/bin/bash date >> /home/output.txt hostname >> /home/output.txt

保存退出后,再给它赋予可执行权限:

$ chmod +x auto_run_script.sh

然后,我们再将脚本添加到/etc/rc.d/rc.local文件最后一行:

$ vim /etc/rc.d/rc.local /home/auto_run_script.sh

然后,直接重启即可

方式三、使用 crontab

crontab 是 Linux 下的计划任务,当时间达到我们设定的时间时,可以自动触发某些脚本的运行。

我们可以自己设置计划任务时间,然后编写对应的脚本。但是,有个特殊的任务,叫作@reboot,我们其实也可以直接从它的字面意义看出来,这个任务就是在系统重启之后自动运行某个脚本。

那它将运行的是什么脚本呢?我们如何去设置这个脚本呢?我们可以通过crontab -e来设置。

$ crontab -e @reboot /home/alvin/auto_run_script.sh

然后,直接重启即可。运行的效果跟上面类似。

http://www.jsqmd.com/news/475356/

相关文章:

  • Python实战:用ncnn验证模型转换成功的3种方法(附完整代码)
  • 终极指南:Zelda64Recomp跨平台兼容性详解 - Windows与Linux系统的完美适配方案
  • 三明市商用车主的2026年展望:如何定义可靠的尿素后处理品牌 - 2026年企业推荐榜
  • 从NCDC到本地分析:一站式气象数据获取与Python自动化处理指南
  • 2025年中科院预警期刊全解析:科研小白如何避开论文工厂陷阱?
  • Zotero插件:Green Frog(绿青蛙)与easyScholar联动配置全攻略
  • AE函数讲解大全 附带下载链接
  • Traceroute结果解读指南:如何从毫秒数和星号中找出网络瓶颈
  • 五大主流Web GIS框架深度对比:从Leaflet到Cesium的实战选型指南
  • 分组密码设计实战:为什么AES选择SPN而DES用Feistel?从硬件到安全的深度解析
  • 红队工具实测:用Fenjing一键搞定Jinja2 SSTI漏洞(含自定义WAF绕过脚本编写)
  • 使用Marqo构建多语言法律数据库的技术实践
  • 基于TLS协议与多特征融合的恶意加密流量智能检测实战
  • 2023最新测评:5款网页版PostgreSQL管理工具横向对比(含TeamPostgreSQL实战)
  • Marqo语音搜索系统:解锁音频内容的信息价值
  • 2026年酱香果酒性价比之选:专业公司深度评测 - 2026年企业推荐榜
  • LiveCharts2 核心架构与工作原理深度解析
  • Depth Anything 3实战:如何用DINOv2 Transformer一键生成3D高斯点云?
  • 安卓逆向实战:从脱壳到签名算法还原——以某新闻App为例
  • 构建AI Agent驱动的自动化测试设计流水线
  • ImGui字体控制避坑指南:为什么SetWindowFontScale会影响其他窗口?
  • Java安全实战:手把手教你复现CC1链漏洞(附完整代码)
  • 国内开发者福音:5个无需魔法快速下载HuggingFace大模型的镜像站(附实测速度对比)
  • 从LAN8742A到YT8512H:手把手教你移植PHY驱动到STM32F407(含避坑指南)
  • GESP C++编程题实战:小杨购物问题解析与优化思路(附完整代码)
  • Windows 10/11网络设置全攻略:如何手动配置IPv4地址和子网掩码(附常见问题解决)
  • 数学建模竞赛必备:3本被美赛国赛选手翻烂的宝藏书单
  • Mac用户福音:用ZeroTier一键穿透内网访问Windows上的VMware虚拟机(附SSH连接教程)
  • 免费在线地图全攻略:从MapOnline插件安装到多平台地图资源调用(避坑2023最新版)
  • NOAA气象数据获取全攻略:从站点选择到字段解析