交互式shell与非交互式shell
首先一点是明确的:/etc/profile是设置所有用户的环境变量的配置文件,/home/omm/.profile是针对特定的用户设置环境变量的配置文件(omm用户)。
但是重要的区别是:/etc/profile并不是每次都会加载的。它要区分login,non-login,interactive和non-interactive 模式的情况。
login 代表用户登入, 比如使用 "su -" 命令, 或者用 ssh 连接到某一个服务器上, 都会使用该用户默认 shell 启动 login shell 模式。该模式下的 shell 会去自动执行 /etc/profile 和 ~/.profile 文件。
no-login shell 的情况是我们在终端下直接输入 bash 或者 bash -c "CMD" 来启动的 shell。该模式下是不会自动去运行任何的 profile 文件。
interactive shell 是交互式shell, 顾名思义就是用来和用户交互的, 提供了命令提示符可以输入命令。
non-interactive shell 则一般是通过 bash -c "CMD" 来执行的bash。
SSH login或者 sudo或者su - [USER] 命令都是是典型的 interactive login shell
但是ssh server CMD执行的命令或通过程序执行远程的命令,理论上应该既是non-interactive non-login(非交互也是非登入的),它是不会执行/etc/profile的。
图1
可以参考一下资料:
https://www.gnu.org/software/bash/manual/html_node/Bash-Startup-Files.html
https://www.gnu.org/software/bash/manual/html_node/Interactive-Shells.html#Interactive-Shells
https://wido.me/sunteya/understand-bashrc-and-profile
http://www.cnblogs.com/qcly/p/3273373.html
了解了上述场景,那么就比较清晰。
内存的问题是由于调用了curl命令导致的。其调用顺序如下:
Controller -> ssh -> bash -> nodeagent -> hdfs-service-check.sh -> curl
由于controller是通过ssh调用启动nodeagent的,通过前面的描述可以知道,它是一个非交互式的非登入式的shell,
将不会调用加载/etc/profile,这就导致了nodeagent没有NSS这个环境变量,nodeagent调用hdfs-service-check.sh,
因为子进程继承父进程的环境变量的缘故,所以hdfs-service-check.sh也没有NSS环境变量,所以curl命令仍然存在
内存的问题。
那么为什么将NSS变量加在/home/omm/.profile中就可以了呢?
那是因为FusionInsight主动显式地调用了加载了这个文件。
从下面的这张调用关系图也可以看出在启动nodeagent时显式地加载了/home/omm/.profile文件:
图2