登录
/
注册
首页
论坛
其它
首页
科技
业界
安全
程序
广播
Follow
关于
签到
每天签到奖励2-10圆
导读
排行榜
TG频道
发帖说明
登录
/
注册
账号
自动登录
找回密码
密码
登录
立即注册
搜索
搜索
关闭
CSDN热搜
程序园
精品问答
技术交流
资源下载
本版
帖子
用户
软件
问答
教程
代码
写记录
VIP申请
VIP网盘
网盘
联系我们
发帖说明
每日签到
道具
勋章
任务
淘帖
动态
分享
留言板
导读
设置
我的收藏
退出
腾讯QQ
微信登录
返回列表
首页
›
业界区
›
业界
›
Linux开机启动脚本(cron 的 @reboot 特性)
Linux开机启动脚本(cron 的 @reboot 特性)
[ 复制链接 ]
裴涛
前天 13:03
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 @rebootsystemdrc.local适用场景轻量级脚本、用户级任务复杂服务(需进程管理、日志)兼容旧系统、简单命令配置难度简单(1行配置)中等(需写 .service 文件)简单(编辑 rc.local)依赖系统所有支持 cron 的系统systemd 系统(CentOS7+ 等)支持 rc.local 的系统进程管理无(需脚本自己处理后台)有(自动重启、状态监控)无(需自己处理后台)日志追溯依赖系统 cron 日志自带 journalctl 日志需手动重定向日志
总结
cron 的 @reboot 适合
简单的开机自启需求
(如启动自定义脚本、初始化配置),配置快、兼容性强;若需要对服务进行精细化管理(如自动重启、状态监控),仍推荐 systemd。针对你的 server.sh 脚本,用 @reboot 配置后,重启系统即可自动触发脚本执行,无需依赖 systemd 服务文件。
来源:程序园用户自行投稿发布,如果侵权,请联系站长删除
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!
vip免费申请,1年只需15美金$
回复
使用道具
举报
提升卡
置顶卡
沉默卡
喧嚣卡
变色卡
千斤顶
照妖镜
高级模式
B
Color
Image
Link
Quote
Code
Smilies
您需要登录后才可以回帖
登录
|
立即注册
回复
本版积分规则
回帖并转播
回帖后跳转到最后一页
浏览过的版块
安全
科技
签约作者
程序园优秀签约作者
发帖
裴涛
前天 13:03
关注
0
粉丝关注
15
主题发布
板块介绍填写区域,请于后台编辑
财富榜{圆}
anyue1937
9994888
dage888
999994
3934307807
993678
4
富账慕
10004
5
刎唇
9993
6
柴古香
9989
7
烯八
9972
8
匝抽
9986
9
筒濂
9977
10
孙淼淼
9983
查看更多