执行Shell脚本,报java: command not found

问题描述

C: 今天笔者在公司的 dev 环境服务器上,将一个 Java 程序启动脚本做成了一个系统服务。本来是一件很简单的事情,但是在启动服务时,却报错了。

报的错误也是言简意赅:java: command not found。很直白的告诉了你,它找不到 java 命令。

在这里插入图片描述

原因分析

既然是找不到 java 命令,首先要排查的自然是服务器里究竟有没有安装和配置好 Java 环境了,用 java -version 命令检测一下就可以了。

[root@business11 ~]# java -version
java version "1.8.0_202"
Java(TM) SE Runtime Environment (build 1.8.0_202-b08)
Java HotSpot(TM) 64-Bit Server VM (build 25.202-b08, mixed mode)

Java 环境是配置好的,那还得是看脚本自身的问题了。其实,这个问题以前印象里也出现过,不过是很久以前初次使用 Shell 脚本的时候了,最终的问题点是因为直接写的脚本内容,没有添加 #!/bin/bash 声明导致的。

打开脚本内容看了看,这个声明也加着呢。

#!/bin/bash

Java 启动脚本内容······

解决方案

既然以往的经验不能提供帮助,那就对症下药,提示说找不到 java 命令,那说明它识别不到 Java 环境配置,帮它一把就得了呗。复制一份 Java 环境配置,放在脚本内容前,相当于每次执行这个脚本的时候,先做一次临时环境配置。

笔者说: 如果你要使用下方的配置,不要直接复制了事,记得将配置中的 JDK 安装路径,替换为你自己实际的 JDK 安装路径。

#!/bin/bash
JAVA_HOME=/opt/disk/java/jdk1.8.0_202 # 如果你要使用,记得替换为你自己实际的 JDK 安装路径
CLASSPATH=.:$JAVA_HOME/lib.tools.jar
PATH=$JAVA_HOME/bin:$PATH
export JAVA_HOME CLASSPATH PATH

Java 启动脚本内容······

解决方案2

这个问题的根源,其实是因为 /etc/profile 或者 /etc/security/limit.d 这些文件中配置的环境变量仅对通过 pam 登录的用户生效,systemd 系统服务是不读这些配置的,所以这就造成登录到终端时查看环境变量和手动启动应用都一切正常,但是系统服务无法正常启动应用。

所以,如果想让 systemd 系统服务使用环境变量也可以在编写的服务内指定好环境变量。

[Unit]
Description=xxx
Wants=network-online.target
After=network-online.target

[Service]
# 如果你要使用,记得替换为你自己实际的 JDK 安装路径
Environment="JAVA_HOME=/opt/disk/java/jdk1.8.0_202"
Environment="CLASSPATH=.:$JAVA_HOME/lib.tools.jar"
Environment="PATH=$JAVA_HOME/bin:$PATH"
ExecStart=/bin/bash /opt/disk/xxx/start-schedule.sh
KillSignal=SIGTERM

[Install]
WantedBy=multi-user.target

修改完系统服务,别忘了重新加载和重新启动。

systemctl daemon-reload
systemctl restart xxx
### 解决 Shell 中 `for` 循环命令未找到的问题 当遇到 `for: command not found` 错误时,通常意味着当前使用的 shell 并不支持这种语法或者是由于环境变量配置不当导致无法识别标准的 Bash 命令。为了确保能够正常使用 `for` 循环,在编写脚本时应指定解释器为 `/bin/bash` 或者其他兼容 POSIX 的 shell。 #### 正确设置 Shebang 行 确保脚本的第一行是指向正确解释器路径的 shebang 行: ```bash #!/bin/bash ``` 这会强制使用 Bash 来运行该脚本而不是依赖于默认登录 shell[^1]。 #### 验证文件权限 确认脚本具有可执行权限。可以通过以下命令来赋予执行权限: ```bash chmod +x scriptname.sh ``` 其中 `scriptname.sh` 是实际的脚本名称[^2]。 #### 使用绝对路径调用命令 有时可能是因为某些命令不在系统的 PATH 变量中而引发此问题。尝试通过提供完整的命令路径来进行调试,例如对于内置命令可以直接前缀加上 bash: ```bash /bin/bash -c 'for var in $(seq 1 5); do echo $var; done' ``` 这种方式可以帮助排除是否因为找不到特定命令而导致的问题[^3]。 #### 检查是否有拼写错误或其他语法问题 仔细检查代码中的每一个字符,特别是关键字如 `do`, `done` 是否书写正确无误;另外注意花括号 `{}` 和分号`;` 的位置也要符合规范[^4]。 ```bash for num in {1..5}; do echo "Number is ${num}" done ``` 以上方法应该能有效解决大多数情况下出现的 `for: command not found` 错误情况。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

查尔斯-BUG万象集

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值