首页 > 代码库 > 交互式shell与非交互式shell

交互式shell与非交互式shell

         首先一点是明确的:/etc/profile是设置所有用户的环境变量的配置文件,/home/omm/.profile是针对特定的用户设置环境变量的配置文件(omm用户)。

但是重要的区别是:/etc/profile并不是每次都会加载的。它要区分loginnon-logininteractivenon-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

交互式shell与非交互式shell