如何在Ubuntu下将Java程序设置成定时任务,实现自动化运行?
- 内容介绍
- 文章标签
- 相关推荐
在 Ubuntu 下将 Java 程序设为定时任务,很多人遇到的痛点主要集中在四个方面:
- 不确定 Java 程序如何打包成可直接执行的 jar。
- 写 shell 脚本时常出现方法错误或权限不足导致运行失败。
- crontab 的语法和调度规则让人摸不着头脑,特别是星号、斜杠、逗号的组合。其实,
- cron 服务未启动或没有及时重启。导致定时任务根本不执行,
下面按步骤拆解并给出完整示例,帮你一次性搞定。
一、准备工作:确认环境与安装必要组件
检查 Java 是否已安装:
java -version
javac -version
若未安装。可通过 apt 安装:
sudo apt update
sudo apt install openjdk-11-jdk
1️⃣ 检查 cron 服务状态
Ubuntu 默认已预装 cron,但在某些镜像或最小化安装中可能未开启。请先确认并启动:
sudo systemctl status cron.service # 检查状态
sudo systemctl enable --now cron.service # 开机自启并立即启动
二、把 Java 程序打包为可执行 JAR
为什么需要 fat JAR?按理说,
- 避免运行时缺失第三方依赖导致报错。
- 部署更简单,只需一个文件即可运行。
Maven 示例:
org.apache.maven.plugins
maven-shade-plugin
3.4.1
<.execution>
package
<goal>shade
说到接下来执行。
mvn clean package
# 打包后会生成 target/your-app.jar
⚠️ 小贴士:如果使用 Eclipse 或 IntelliJ 打包,记得勾选 “Include dependencies in jar” 或使用类似 “Uber‑Jar” 插件。
三、编写 Shell 脚本来启动 JAR 并记录日志
创建脚这篇文章件,例如 /home/youruser/start-java.sh:
#!/bin/bash
# 定义方法和日志文件
JAR_PATH="/home/youruser/app/your-app.jar"
LOG_FILE="/home/youruser/app/run.log"
# 确保日志目录存在
mkdir -p "$"
# 启动程序,并把输出追加到日志中
/usr/bin/java -jar "$JAR_PATH">> "$LOG_FILE" 2>&1 &
echo "Java app started at $">> "$LOG_FILE"
❌ 常见错误:
- #!/bin/bash 与 #!/usr/bin/env bash 区别?- 两者都能工作,但建议使用 /usr/bin/env 可以兼容不同位置的 bash。不过,
- $PATH 未配置?- 在脚本里直接使用绝对方法避免 PATH 问题。
- &&&>- 用来追加日志而不是覆盖。
🔧 给脚本加上可执行权限:
chmod +x /home/youruser/start-java.sh
四、通过 crontab 设置定时任务
① 编辑当前使用者的 crontab 文件:
crontab -e
✔️ 如果是第一次打开。会提示你选择编辑器,推荐 vim 或 nano;如果你更习惯使用 emacs,可以自行设置。
Cron 表达式解析:
| #1 分钟 | #2 小时 | #3 日 | #4 月 | #5 周 0 和 7 都代表星期天 |
|---|
📅 示例:每天凌晨 02:30 启动程序;每小时整点检查一次服务是否正常。
| * * | * * | * * | * * | * * | /home/youruser/start-java.sh> /dev/null 2>&1 # 每分钟执行一次脚本并抛弃输出 |
⚠️ 建议不要直接把命令写在 crontab 行里而是调用上面编写好的脚本;这样可以统一管理方法与日志,避免因环境变量差异导致失败。按理说,
❗ 常见陷阱与排查技巧:
-
① 没有重启 Cron 服务?在修改完 crontab 后请务必重启或重新加载:
sudo systemctl restart cron.service 或者 sudo service cron restart
' 这一步很容易被忽略,特别是在 Docker 容器内运行 Cron 时。怎么说呢,
chmod +x /home/youruser/start-java.sh ls -l /home/youruser/start-java.sh
如果用相对方法会出现找不到文件的问题。
export JAHOME=/usr/lib/jvm/java-11-openjdk-amd64 export PATH=$JAHOME/bin:$PATH /usr/bin/java -jar ... '' 如果你已经在程序全局配置了 JAHOME。可在 /etc/environment 或 ~/.profile 中添加,也能解决一样问题。怎么说呢,
五、验证任务是否生效并持续监控结果
在 Ubuntu 下将 Java 程序设为定时任务,很多人遇到的痛点主要集中在四个方面:
- 不确定 Java 程序如何打包成可直接执行的 jar。
- 写 shell 脚本时常出现方法错误或权限不足导致运行失败。
- crontab 的语法和调度规则让人摸不着头脑,特别是星号、斜杠、逗号的组合。其实,
- cron 服务未启动或没有及时重启。导致定时任务根本不执行,
下面按步骤拆解并给出完整示例,帮你一次性搞定。
一、准备工作:确认环境与安装必要组件
检查 Java 是否已安装:
java -version
javac -version
若未安装。可通过 apt 安装:
sudo apt update
sudo apt install openjdk-11-jdk
1️⃣ 检查 cron 服务状态
Ubuntu 默认已预装 cron,但在某些镜像或最小化安装中可能未开启。请先确认并启动:
sudo systemctl status cron.service # 检查状态
sudo systemctl enable --now cron.service # 开机自启并立即启动
二、把 Java 程序打包为可执行 JAR
为什么需要 fat JAR?按理说,
- 避免运行时缺失第三方依赖导致报错。
- 部署更简单,只需一个文件即可运行。
Maven 示例:
org.apache.maven.plugins
maven-shade-plugin
3.4.1
<.execution>
package
<goal>shade
说到接下来执行。
mvn clean package
# 打包后会生成 target/your-app.jar
⚠️ 小贴士:如果使用 Eclipse 或 IntelliJ 打包,记得勾选 “Include dependencies in jar” 或使用类似 “Uber‑Jar” 插件。
三、编写 Shell 脚本来启动 JAR 并记录日志
创建脚这篇文章件,例如 /home/youruser/start-java.sh:
#!/bin/bash
# 定义方法和日志文件
JAR_PATH="/home/youruser/app/your-app.jar"
LOG_FILE="/home/youruser/app/run.log"
# 确保日志目录存在
mkdir -p "$"
# 启动程序,并把输出追加到日志中
/usr/bin/java -jar "$JAR_PATH">> "$LOG_FILE" 2>&1 &
echo "Java app started at $">> "$LOG_FILE"
❌ 常见错误:
- #!/bin/bash 与 #!/usr/bin/env bash 区别?- 两者都能工作,但建议使用 /usr/bin/env 可以兼容不同位置的 bash。不过,
- $PATH 未配置?- 在脚本里直接使用绝对方法避免 PATH 问题。
- &&&>- 用来追加日志而不是覆盖。
🔧 给脚本加上可执行权限:
chmod +x /home/youruser/start-java.sh
四、通过 crontab 设置定时任务
① 编辑当前使用者的 crontab 文件:
crontab -e
✔️ 如果是第一次打开。会提示你选择编辑器,推荐 vim 或 nano;如果你更习惯使用 emacs,可以自行设置。
Cron 表达式解析:
| #1 分钟 | #2 小时 | #3 日 | #4 月 | #5 周 0 和 7 都代表星期天 |
|---|
📅 示例:每天凌晨 02:30 启动程序;每小时整点检查一次服务是否正常。
| * * | * * | * * | * * | * * | /home/youruser/start-java.sh> /dev/null 2>&1 # 每分钟执行一次脚本并抛弃输出 |
⚠️ 建议不要直接把命令写在 crontab 行里而是调用上面编写好的脚本;这样可以统一管理方法与日志,避免因环境变量差异导致失败。按理说,
❗ 常见陷阱与排查技巧:
-
① 没有重启 Cron 服务?在修改完 crontab 后请务必重启或重新加载:
sudo systemctl restart cron.service 或者 sudo service cron restart
' 这一步很容易被忽略,特别是在 Docker 容器内运行 Cron 时。怎么说呢,
chmod +x /home/youruser/start-java.sh ls -l /home/youruser/start-java.sh
如果用相对方法会出现找不到文件的问题。
export JAHOME=/usr/lib/jvm/java-11-openjdk-amd64 export PATH=$JAHOME/bin:$PATH /usr/bin/java -jar ... '' 如果你已经在程序全局配置了 JAHOME。可在 /etc/environment 或 ~/.profile 中添加,也能解决一样问题。怎么说呢,
五、验证任务是否生效并持续监控结果

