crontab -e运行jar文件时相对路径错乱问题如何解决
问题根因
crontab 执行定时任务时,默认工作目录为当前执行用户的家目录(即你遇到的/home/myUser/路径),和你手动在终端切换到jar包所在目录执行时的工作目录不匹配,导致jar内部使用../folder/dbfile.db这类相对路径时,会以家目录为基准做路径解析,最终出现文件找不到、程序运行异常的问题。
另外你当前配置里的日志重定向路径也是相对路径,同样会被解析到家目录下,不会生成到你预期的Desktop/IP/logs目录里。
解决方法
优先选第一种,改动最小不需要调整代码:
- 方案1:执行java命令前先切换到jar包所在目录,所有路径统一用绝对路径
直接编辑crontab,将原有配置替换为如下内容,注意把/home/myUser替换为你自己的实际用户家目录绝对路径:
@reboot sleep 60 && cd /home/myUser/Desktop/IP && java -jar server.jar > /home/myUser/Desktop/IP/logs/server.log 2>&1 @reboot sleep 120 && cd /home/myUser/Desktop/IP && java -jar backup.jar > /home/myUser/Desktop/IP/logs/backup.log 2>&1
配置里先通过cd命令把工作目录切到jar包所在的Desktop/IP目录,后续jar运行时的相对路径就会以这个目录为基准解析,和你手动在终端切目录执行的效果完全一致。日志路径也写绝对路径,避免日志文件生成位置不符合预期。
- 方案2:封装独立启动脚本(适合启动参数多、后续需要调整启动逻辑的场景)
在jar包所在目录新建启动脚本,比如start_server.sh,写入如下内容:
#!/bin/bash # 切换工作目录到脚本自身所在目录 cd $(dirname $0) java -jar server.jar > logs/server.log 2>&1
给脚本加可执行权限:
chmod +x /home/myUser/Desktop/IP/start_server.sh
backup服务的启动脚本按同样逻辑编写即可,最后把crontab配置改成直接调用对应脚本:
@reboot sleep 60 && /home/myUser/Desktop/IP/start_server.sh @reboot sleep 120 && /home/myUser/Desktop/IP/start_backup.sh
脚本里用cd $(dirname $0)可以自动定位到脚本所在目录,后续就算你把整个IP目录移动到其他位置,脚本也不需要修改路径。
注意:crontab的执行环境和用户登录终端的交互环境是隔离的,不会自动加载你终端里的环境变量、路径别名配置,所有涉及文件、命令的路径如果不确定,优先写绝对路径,可以避免90%以上的crontab执行异常问题。
内容的提问来源于stack exchange,提问作者Mr. Nielzom
相关产品推荐
相关产品推荐

