近日写了一个脚本,想要通过一个命令就可以知道集群中所有的Java进程。
按照网上blog的提示,写了如下的脚本:
for host in host1, host2, host3
do
echo ============$host==========
ssh $host jps
done
但是,其中一台机器出现了找不到jps的问题。
但是,我手动ssh上那台机器然后jps是可以行得通。
根据网上blog,我了解到了其实ssh有两种不同的情况。
1. 通过SSH登录后再执行命令和脚本
这也是我们最常使用的方式。先ssh连接上了,再执行需要的命令。
Shell首先会加载/etc/profile
文件,然后再尝试依次去加载下列三个配置文件之一,一旦找到其中一个便不再接着寻找:
~/.bash_profile
~/.bash_login
~/.profile
2. 通过SSH直接执行远程命令和脚本
这种方式会使用Bash的non-interactive + non-login shell模式,它会创建一个shell,执行完脚本之后便退出,不再需要与用户交互。
它不会去执行/etc/profile文件,而会去用户的HOME目录检查.bashrc
并加载。
3. 解决方法
- 直接写绝对路径
for host in host1, host2, host3
do
echo ============$host==========
ssh $host $JAVA_HOME/bin/jps
done
- 在登录用户的
~/.bashrc
里增加Java路径