zoukankan      html  css  js  c++  java
  • /etc/profile与/etc/bashrc、交互式与非交互式、login与non-login shell的差别

    线上的memcached又挂了。仍然没有得到core文件。

    排查原因,同事发现启动memcached的脚本存在可疑问题。

    问题一:没有设置memcached工作文件夹,有可能core dump时没有工作文件夹写权限
    这些脚本由crontab启动。脚本中没有设置工作文件夹。而这是非root用户的crontab。启动memcached时,工作文件夹不是memcached可执行文件所在文件夹。实验证明,这个是用户的home文件夹,crontab执行的脚本中打印pwd,结果是"home/work",work是当前用户。
    问题二:在/etc/profile中设置的ulimit -c unlimited对crontab的脚本是无效的
    在查阅相关文档后得知。/etc/profile中的设置仅仅对Login Shell生效,而crontab执行脚本的shell环境是non-login的,不会载入/etc/profile的设置。

    在这里。须要总结一下/etc/profile与/etc/bashrc的差别。以及交互式与非交互式、login与non-login shell概念的差别。

    熟悉Linux的程序猿应该有过在~/.profile文件里环境变量设置的经验,在~/.profile设置的环境变量仅仅会对那一个用户有效。而假设要对所有的用户有效,则要设置/etc/profile。/etc/profile就是~/.profile的全局版本号。其实。一旦打开一个交互式login shell,或者以--login选项登录的非交互式shell。都会首先载入并运行/etc/profile中的命令,然后再依次载入~/.bash_profile, ~/.bash_login, 和~/.profile中的命令。


    这里又涉及到交互式shell与非交互式shell,login shell与non-login shell的概念。依照这两个维度划分,那么共同拥有四种shell:交互式login shell,交互式非login shell,非交互式login shell。非交互式非login shell。

    交互式的:顾名思义。这样的shell中的命令时由用户从键盘交互式地输入的,执行的结果也可以输出到终端显示给用户看。

    非交互式的:这样的shell可能由某些自己主动化过程启动,不能直接从请求用户的输入。也不能直接输出结果给终端用户看。输出最好写到文件。

    login的意思是这样的是在某用户由/bin/login登陆进系统后启动的shell,跟这个用户绑定。这个shell是用户登陆后启动的第一个进程。login进程在启动shell时传递第0个參数指明shell的名字,该參数第一个字符为"-",指明这是一个login shell。比方对bash而言,启动參数为"-bash"。

    当bash以login shell启动时,它会运行/etc/profile中的命令,然后/etc/profile调用/etc/profile.d文件夹下的全部脚本。然后运行~/.bash_profile。~/.bash_profile调用~/.bashrc,最后~/.bashrc又调用/etc/bashrc。


    要识别一个shell是否为login shell。仅仅需在该shell下运行echo $0:
    # echo $0
    假设输出为该shell名字,加上一个'-'前缀。则说明该shell为login shell。比如-bash,-su等等。实验一下。在本人的Ubuntu系统下。打开Terminal,输入echo $0,得到的是"bash",说明这不是一个login shell。而由SSH登陆到server上,运行相同命令。得到了"-bash"的结果,说明由SSH登陆的为login shell。

    非login的:不需login而由某些程序启动的shell。

    传递给shell的參数,是没有'-'前缀的。还以Bash为例。当以非login方式启动时,它会调用~/.bashrc。随后~/.bashrc中调用/etc/bashrc。最后/etc/bashrc调用全部/etc/profile.d文件夹下的脚本。

    这个有兴趣的能够打开这些文件看一看。非login的shell主要包含以"#su","#su USERNAME"启动的shell。和图形终端(比如Ubuntu的Terminal),运行的脚本等等。

    识别非login的shell方法还是运行#echo $0命令,得到的结果假设没有'-'前缀。即为非login的。



    回到我们遇到的问题,在crontab中启动的脚本的shell都是非login的。那么就不会载入/etc/profile中的命令。从而我们在/etc/profile中设置的"ulimit -c unlimited"命令对crontab中启动的脚本也是无效的了,因此这些脚本中启动的memcached意外挂掉后也不会有core文件了。

  • 相关阅读:
    Aspnet_regiis加密web.config
    C#加密算法汇总
    ?? 运算符
    游戏外挂技术初探
    正则表达式语法
    C++Primer第四版13.5.1. 定义智能指针类的例子被new蒙蔽_BLOCK_TYPE_IS_VALID
    Adobe Flex 成为 Apache 基金会顶级开源项目
    程序员老黄历
    Flash多点触控体验和简介
    Flash开发人员必备:最新离线网页版ActionScript 3.0API文档、 flex 4.6 air 3.5 开发人员指南
  • 原文地址:https://www.cnblogs.com/wzzkaifa/p/7169640.html
Copyright © 2011-2022 走看看