stop_all.sh

#! /bin/bash
    ./exp_start.sh hadoop@master1 '1234' "cd $HADOOP_HOME" 'sbin/stop-yarn.sh'
    ./exp_start.sh hadoop@master1 '1234' "cd $HADOOP_HOME" 'sbin/hadoop-daemons.sh stop datanode'

for host4 in master1-s master1
do
    ./exp_start.sh hadoop@$host4 '1234' "cd $HADOOP_HOME" 'sbin/hadoop-daemon.sh stop zkfc'
done

    ./exp_start.sh hadoop@master1-s '1234' "cd $HADOOP_HOME" 'sbin/hadoop-daemon.sh stop namenode'
    ./exp_start.sh hadoop@master1 '1234' "cd $HADOOP_HOME" 'sbin/hadoop-daemon.sh stop namenode'

for host2 in slave1 master1-s master1
do
    ./exp_start.sh hadoop@$host2 '1234' "cd $HADOOP_HOME" 'sbin/hadoop-daemon.sh stop journalnode'    
done    
    
    
for host1 in  slave1 master1-s master1
do
    ./exp_start.sh hadoop@$host1 '1234' "cd $ZOOKEEPER_HOME" 'bin/zkServer.sh stop'
done







    
   
    
   
<think>好的,我现在需要解决用户的问题:他们的Java代码使用JschUtil.exec执行一个shell脚本,其中一台服务器能顺利执行stop_all.sh,另一台却因环境变量问题失败。用户已经给出了脚本内容,我需要分析原因。 首先,用户提到权限等级相同,但其中一台获取不到环境变量。可能的原因是什么呢?脚本中有source set_env.sh,这个文件是否存在问题?或者执行路径的问题? 先看脚本结构。脚本开头检查是否为root用户,如果不是则继续。然后记录时间,接着source set_env.sh,进入目录,执行两个stop脚本。问题可能出在set_env.sh没有被正确加载,或者环境变量在另一台服务器上设置不同。 为什么另一台服务器获取不到环境变量?可能的情况是:set_env.sh文件在另一台服务器的当前目录下不存在,或者权限不足无法读取。或者,当通过Jsch执行时,当前工作目录不是/usr/local/cloud_nms/service/,导致source set_env.sh时路径错误。 用户执行命令是cd到该目录再执行脚本,所以脚本中的相对路径应该没问题。但可能通过Jsch执行时,会话的环境变量和交互式shell不同,导致某些变量未被正确设置。例如,set_env.sh中可能依赖某些用户环境变量,而通过非交互式shell执行时这些变量不存在。 另外,检查set_env.sh的内容是否有问题。比如,是否使用了绝对路径,或者是否有依赖其他环境变量。例如,service_install_path这个变量是否在set_env.sh中被正确设置,可能在另一台服务器上该变量设置有问题。 还有,执行脚本的用户是否有权限读取set_env.sh文件?虽然用户权限相同,但文件权限可能不同,导致无法读取。或者脚本中的路径是否正确,比如./set_env.sh是否在正确的目录下。 另外,当通过Jsch执行命令时,默认可能不会加载用户的profile或bashrc文件,导致环境变量缺失。例如,某些环境变量可能在.bash_profile中设置,但非交互式shell不会加载这些文件,导致set_env.sh中的依赖变量不存在。 可能的解决方法是:在脚本中显式source用户的profile文件,或者在执行命令时指定使用登录shell。例如,在exec命令中使用bash -l来加载登录环境,或者在脚本中source ~/.bashrc。 另一个可能性是,set_env.sh中的路径使用了相对路径,而通过Jsch执行时当前目录不是脚本所在目录。虽然在命令中先cd到目录,但可能因为执行环境不同,导致路径问题。可以尝试在脚本中使用绝对路径来source set_env.sh,或者先cd到脚本所在目录。 此外,检查两台服务器的set_env.sh文件内容是否一致,是否有服务器特定的差异。比如,service_install_path在两台服务器上是否被正确设置,或者是否存在其他依赖的环境变量。 总结可能的原因: 1. set_env.sh文件在另一台服务器上的路径或内容不同,导致无法正确加载环境变量。 2. 通过Jsch执行时,环境变量未加载用户profile,导致set_env.sh依赖的变量不存在。 3. 文件权限问题,导致无法读取set_env.sh或其他相关文件。 4. 脚本中的路径问题,如相对路径在非交互式shell中表现不同。 需要用户进一步验证:检查另一台服务器的set_env.sh是否存在,是否有权限,内容是否正确;检查执行脚本时的当前目录是否正确;尝试在脚本中输出当前路径或环境变量,查看日志;或者尝试在exec命令中指定绝对路径来source set_env.sh。</think>问题原因分析及解决方案: $\boxed{\text{根本原因是SSH非交互式会话未加载必要环境变量}}$,具体表现为: 1. **环境差异**(核心问题) - 在不能执行的服务器上,通过SSH执行脚本时处于$\text{非交互式shell}$,未加载用户环境配置文件(如$\text{~/.bash_profile}$) - 脚本中使用的$\text{service_install_path}$等变量依赖$\text{set_env.sh}$,而该文件可能又依赖用户环境变量 2. **路径问题**(常见陷阱) - 虽然执行了$\text{cd /usr/local/cloud_nms/service/}$,但非交互式shell的$\text{PWD}$可能未正确继承 - 建议使用绝对路径:$\text{. /usr/local/cloud_nms/service/set_env.sh}$ 3. **执行环境差异**(重要对比点) - 成功服务器可能因$\text{set_env.sh}$文件中的路径配置为绝对路径,或该服务器默认shell环境已包含必要变量 $\boxed{\text{解决方案}}$: ```bash #!/bin/bash if [ "$(id -u)" -eq 0 ]; then echo -e "\e[31mThis script cannot be run as the root user.\e[0m" exit 1; fi # 显式加载用户环境 source ~/.bash_profile 2>/dev/null || source ~/.bashrc 2>/dev/null # 使用绝对路径定位文件 SCRIPT_DIR="/usr/local/cloud_nms/service" source "${SCRIPT_DIR}/set_env.sh" cd "${service_install_path}" || exit 1 # 添加错误处理 current_time1=$(date +"%Y-%m-%d %T") echo "start time:$current_time1" ./stop_business.sh ./stop_platform.sh current_time2=$(date +"%Y-%m-%d %T") echo "end time:$current_time2" ``` **Java代码增强建议**: ```java // 添加环境变量显式传递 ChannelExec channel = (ChannelExec) session.openChannel("exec"); String command = "cd /usr/local/cloud_nms/service/ && . ./set_env.sh && sh stop_all.sh"; channel.setCommand("bash -c '" + command + "'"); // 使用登录式shell // 或显式传递PATH channel.setEnv("PATH", System.getenv("PATH")); channel.setEnv("service_install_path", "/your/actual/path"); ``` 验证步骤: 1. 在两台服务器上执行:$\text{env | grep service_install_path}$ 2. 通过SSH手动执行:$\text{ssh user@host "cd /path && sh -x stop_all.sh"}$ 查看详细报错 3. 检查$\text{set_env.sh}$文件权限:$\text{ls -l /usr/local/cloud_nms/service/set_env.sh}$ $\boxed{\text{特别注意}}$:建议在所有环境变量引用处添加默认值: ```bash cd ${service_install_path:-/default/path} # 避免变量为空时路径错误 ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值