Debian 11 VPS启动Shell脚本无法访问Jar文件问题求助
解决Debian 11下Jar文件开机启动失败问题
一、先修复脚本的换行符错误
你执行脚本时出现的: not found/runjar.sh: 2:类错误,是因为脚本使用了Windows格式的CRLF换行符,Linux系统无法正确解析。解决方法:
- 安装
dos2unix工具转换格式:
apt update && apt install -y dos2unix dos2unix /etc/init.d/runjar.sh
- 若无法安装工具,用
sed命令手动去除换行符中的\r字符:
sed -i 's/\r$//' /etc/init.d/runjar.sh
二、排查Jar文件无法访问的问题
1. 确认文件真实存在
执行命令验证路径是否正确:
ls -l /root/bot.jar
若输出为空,说明文件不存在,请核对Jar文件的实际存放路径。
2. 使用Java的绝对路径
开机启动脚本的环境变量PATH可能不包含Java路径,需用绝对路径调用Java。先查找Java安装路径:
which java
假设输出为/usr/bin/java,修改runjar.sh脚本,将java替换为绝对路径:
#!/bin/sh echo "Running Jar" /usr/bin/java -jar /root/bot.jar exit 0
3. 让Jar后台运行(关键)
直接执行java -jar会阻塞脚本,导致开机启动流程无法完成,需让Jar在后台运行并记录日志:
修改脚本为:
#!/bin/sh echo "Starting Jar Bot in background" nohup /usr/bin/java -jar /root/bot.jar > /var/log/bot.log 2>&1 & exit 0
nohup:让进程脱离终端在后台运行> /var/log/bot.log 2>&1:将标准输出和错误输出写入日志文件,方便后续排查问题
三、推荐使用Systemd管理服务(Debian 11官方标准)
Debian 11默认用Systemd替代传统init.d,稳定性和可管理性更强,步骤如下:
- 创建Systemd服务文件:
nano /etc/systemd/system/bot.service
写入以下内容:
[Unit] Description=Jar Bot Service After=network.target # 确保网络启动后再运行服务 [Service] Type=simple User=root ExecStart=/usr/bin/java -jar /root/bot.jar # 替换为你的Java绝对路径和Jar路径 Restart=always # 进程意外退出时自动重启 RestartSec=5 # 重启间隔5秒 StandardOutput=append:/var/log/bot.log StandardError=append:/var/log/bot.log [Install] WantedBy=multi-user.target # 多用户模式下开机启动
- 重新加载Systemd配置:
systemctl daemon-reload
- 设置开机自启并启动服务:
systemctl enable bot.service systemctl start bot.service
- 检查服务状态:
systemctl status bot.service
额外说明
- 给
/root/bot.jar设置chmod +x是多余操作,Java仅需读取权限即可运行Jar文件,无需执行权限。 - 若使用Systemd管理服务,无需再维护init.d脚本,两种方式二选一即可。
内容的提问来源于stack exchange,提问作者dew
相关产品推荐
相关产品推荐

