Linux开机启动脚本(cron 的 @reboot 特性)
cron 的 @reboot 特性是一种简洁的定时任务配置,专门用于让脚本或命令在 Linux 系统开机完成后自动执行一次,无需指定复杂的时间表达式(如 0 0 * * *),适合轻量级的开机自启需求(如启动自定义服务、初始化配置等)。
一、核心特点
- 触发时机:系统重启并完成基本初始化(如网络、文件系统就绪)后执行,比
rc.local更晚,能避免依赖未就绪的问题。 - 用户级配置:支持不同用户独立配置(如
root用户、普通用户),执行权限与配置用户一致,安全性更高。 - 无需复杂依赖:不依赖
systemd、sysvinit等初始化系统,所有支持 cron 的 Linux 系统(如 CentOS、Ubuntu、Debian)均通用。 - 日志可追溯:执行结果会记录到 cron 日志(如
/var/log/cron),便于排查执行失败原因。
二、使用步骤(以启动 /u01/mis/server.sh start 为例)
1. 确认 cron 服务已启动(避免服务未运行导致不触发)
# 检查 cron 服务状态(CentOS/RHEL 用 crond,Ubuntu/Debian 用 cron)
sudo systemctl status crond # CentOS/RHEL
# 或
sudo systemctl status cron # Ubuntu/Debian
# 若未启动,设置开机启动并启动服务
sudo systemctl enable --now crond # CentOS/RHEL
# 或
sudo systemctl enable --now cron # Ubuntu/Debian
2. 配置 @reboot 任务(两种方式:用户级、系统级)
方式 1:用户级配置(仅当前用户生效,推荐非 root 场景)
# 编辑当前用户的 crontab(无需 sudo,仅修改自己的任务)
crontab -e
在打开的编辑器中添加一行(指定要执行的脚本路径,建议用绝对路径):
# 格式:@reboot 完整脚本路径(& 用于后台执行,避免阻塞 cron)
@reboot /u01/mis/server.sh start &
- 保存退出:按
Ctrl+O确认保存,Ctrl+X退出编辑器(若用nano编辑器)。 - 验证配置:
crontab -l查看当前用户的 cron 任务,确认@reboot行已存在。
方式 2:系统级配置(所有用户生效,需 root 权限,适合全局服务)
# 编辑系统级 cron 配置文件(需 sudo,修改后对所有用户生效)
sudo vim /etc/crontab
在文件末尾添加一行(需指定执行用户,如 root):
# 格式:@reboot 执行用户 完整脚本路径
@reboot root /u01/mis/server.sh start &
- 保存退出:
Esc→:wq保存退出(vim编辑器)。
3. 测试效果(验证开机是否自动执行)
# 重启系统(测试关键步骤)
sudo reboot
# 重启后,检查脚本是否执行(如查看进程、日志)
ps -ef | grep mis-back.jar # 查看脚本启动的进程
cat /u01/mis/backEnd/logs/server.log # 查看脚本输出日志
三、常见问题与解决方案
1. @reboot 任务未执行?
原因 1:脚本路径错误
必须用 绝对路径(如/u01/mis/server.sh),不能用相对路径(如./server.sh),因为 cron 执行时的默认目录是用户家目录(如root的/root)。
解决:确认脚本路径正确,可通过which server.sh或find / -name server.sh查找绝对路径。原因 2:环境变量缺失
cron 执行时的环境变量极简(仅默认PATH=/usr/bin:/bin),若脚本依赖JAVA_HOME、自定义PATH等,会导致命令找不到(如java: 未找到命令)。
解决:在脚本开头显式定义环境变量,或在 cron 任务中指定环境变量:# 方案 1:在 cron 任务中添加环境变量(推荐)
@reboot export PATH=/usr/local/java/jdk1.8.0_341/bin:$PATH && /u01/mis/server.sh start & # 方案 2:在脚本开头添加环境变量(彻底解决)
# 在 /u01/mis/server.sh 开头添加:
export PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/local/java/jdk1.8.0_341/bin
export JAVA_HOME=/usr/local/java/jdk1.8.0_341
原因 3:cron 日志无记录,服务未启动
确认 cron 服务已启动(参考步骤 1),若服务未运行,@reboot自然不触发。
2. 脚本执行了,但进程很快退出?
- 原因:脚本启动的程序需要后台运行(如
nohup ... &),若脚本中缺少后台执行逻辑,cron 执行完脚本后会杀死子进程。
解决:确保脚本中启动命令包含后台运行参数(如你的server.sh中已用nohup ... &,无需额外修改;若其他脚本,需补充该逻辑)。
3. 如何查看 @reboot 执行日志?
cron 执行的任务日志默认记录在系统日志中,可通过以下命令查看:
# CentOS/RHEL:查看 cron 日志
grep CRON /var/log/cron | tail -20
# Ubuntu/Debian:查看 cron 日志(需安装 rsyslog)
grep CRON /var/log/syslog | tail -20
- 日志示例:
Oct 11 09:00:01 CentOS CROND[1234]: (root) CMD (@reboot /u01/mis/server.sh start &),表示@reboot任务已触发。
四、优缺点对比(与其他自启方式)
| 特性 | cron @reboot | systemd | rc.local |
|---|---|---|---|
| 适用场景 | 轻量级脚本、用户级任务 | 复杂服务(需进程管理、日志) | 兼容旧系统、简单命令 |
| 配置难度 | 简单(1行配置) | 中等(需写 .service 文件) | 简单(编辑 rc.local) |
| 依赖系统 | 所有支持 cron 的系统 | systemd 系统(CentOS7+ 等) | 支持 rc.local 的系统 |
| 进程管理 | 无(需脚本自己处理后台) | 有(自动重启、状态监控) | 无(需自己处理后台) |
| 日志追溯 | 依赖系统 cron 日志 | 自带 journalctl 日志 | 需手动重定向日志 |
总结
cron 的 @reboot 适合 简单的开机自启需求(如启动自定义脚本、初始化配置),配置快、兼容性强;若需要对服务进行精细化管理(如自动重启、状态监控),仍推荐 systemd。针对你的 server.sh 脚本,用 @reboot 配置后,重启系统即可自动触发脚本执行,无需依赖 systemd 服务文件。
Linux开机启动脚本(cron 的 @reboot 特性)的更多相关文章
- linux开机启动脚本
linux开机启动脚本 linux 开机启动脚本 用户自定义开机程序(/etc/rc.d/rc.local) 操作最简单,方便.每次都自己启动PHP啊,Nginx啊 烦死了,其他方式还要弄shell啊 ...
- linux 开机启动脚本或者服务
https://blog.csdn.net/zhuchunyan_aijia/article/details/53811368
- linux 的开机启动脚本顺序
linux 开机启动脚本顺序 linux 开机启动脚本顺序. 第一步:启动内核 第二步:执行init (配置文件/etc/inittab) 第三步:启动相应的脚本,并且打开终端/etc/init.d ...
- linux开机启动
开机过程指的是从打开计算机电源直到LINUX显示用户登录画面的全过程.分析LINUX开机过程也是深入了解LINUX核心工作原理的一个很好的途径. 启动第一步--加载BIOS 当你打开计算机电源,计算机 ...
- linux 开机启动过程详解
Linux开机执行内核后会启动init进程,该进程根据runlevel(如x)执行/etc/rcx.d/下的程序,其下的程序是符号链接,真正的程序放在/etc/init.d/下.开机启动的程序(服务等 ...
- LINUX开机启动过程
LINUX开机启动过程 启动第一步--加载BIOS当你打开计算机电源,计算机会首先加载BIOS信息,BIOS信息是如此的重要,以至于计算机必须在最开始就找到它.这是因为BIOS中包含了CPU的相关信息 ...
- Linux开机启动十步骤
启动第一步--加载BIOS 启动第二步--读取MBR 启动第三步--Boot Loader 启动第四步--加载内核 启动第五步--用户层init依据inittab文件来设定运行等级 启动第六步--in ...
- Linux 开机启动顺序_005
***了解Linux开机启动顺序之前先了解一下Linux运行级别,通过inittab配置文件查看运行级别的定义: [root@oldboy ~]# cat /etc/inittab # Default ...
- Redis加入Centos Linux开机启动
Redis加入Centos Linux开机启动 网上有很多redis在linux下自动启动的例子,实现的方式很多,很多都是参考一个老外流传出来启动的例子,其实直接使用是不行,而且有很多地方有一些语法错 ...
- Ubuntu编写开机启动脚本
1 概述 服务器一般不可能百分之百不会挂,于是一般采用主备或者分布式来达到高可用. 挂掉的机器有很多处理策略,常用的就是重新启动,但是为了保证重启之后服务器能够恢复可用状态,需要配置开机启动脚本. 2 ...
随机推荐
- pat 乙级 1090 危险品装箱
pat 乙级 1090 危险品装箱 题目 集装箱运输货物时,我们必须特别小心,不能把不相容的货物装在一只箱子里.比如氧化剂绝对不能跟易燃液体同箱,否则很容易造成爆炸. 本题给定一张不相容物品的清单,需 ...
- java 切换不同的显示风格
简介 java 切换不同的显示风格 code import java.awt.*; import javax.swing.*; public class ImageTest { public stat ...
- 通过ETL工具,高效完成达梦数据库数据同步至数仓Oracle的具体实现
企业在日常运营过程中,会产生海量的数据,这些数据广泛分布于不同的系统.数据库以及存储设备之中.为了充分发挥数据的价值,确保数据的一致性.完整性与可用性,数据同步便成为了企业数据管理体系里至关重要的一环 ...
- Unity DOTS 术语 & 缩写翻译总表(最新版)
- iframe里面获取父级页面URL参数
getParam: function (name) { var reg = new RegExp('(^|&)' + name + '=([^&]*)(&|$)', 'i'); ...
- Linux TCP/UDP socket 通信和IO多路复用
1.socket 通信 1.1 大小端转换 主机字节序 16 位值 <==> 网络字节序 16 位值 主机字节序 32 位值 <==> 网络字节序 32 位值 #include ...
- 【纯新手友好版】教你使用OpenSSH进行服务器访问或管理---安装
一.SSH客户端配置 如果你需要通过SSH远程访问服务器,需要生成密钥对,然后将公钥配置到服务器,具体如下: Step1:检查是否安装了 OpenSSH Client(客户端) 以管理员身份运行pow ...
- IDEA社区版 配置Tomcat服务器
IntelliJ IDEA Community Edition 没有内置Tomcat相关的配置选项 在插件商店有第三方插件 File -> setting -> plugins打开插件中心 ...
- 在高并发情况下,RabbitMQ 是如何实现削峰的?它是如何应对瞬间大量的判题请求的?
消息队列缓冲:RabbitMQ 会将接收到的判题请求封装成消息,存储在消息队列中.当瞬间有大量判题请求到来时,这些请求不会直接冲击后端的判题服务,而是先进入队列排队.这样就可以将突发的高并发请求分散到 ...
- [笔记]中国剩余定理(CRT) & 扩展中国剩余定理(exCRT)
中国剩余定理(CRT) P1495 [模板]中国剩余定理(CRT)/ 曹冲养猪 对于线性同余方程组: \[\begin{cases} x\equiv a_1\pmod{b_1}\\ x\equiv a ...