zoukankan      html  css  js  c++  java
  • 交互式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

  • 相关阅读:
    S1.2 Python开发规范指南
    time & datetime 模块
    10.27 sort
    basic play
    存储过程常规
    存储过程常规
    div学习之div中dl-dt-dd的详解
    div学习之div中dl-dt-dd的详解
    动态代理与静态代理的区别
    xgqfrms™, xgqfrms® : xgqfrms's offical website of GitHub!
  • 原文地址:https://www.cnblogs.com/dotagg/p/6364168.html
Copyright © 2011-2022 走看看