关闭

/etc/profile与/etc/bashrc、交互式与非交互式、login与non-login shell的区别

标签: Linux
1073人阅读 评论(0) 收藏 举报
分类:
线上的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登陆到服务器上,执行同样命令,得到了"-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文件了。
0
0

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:30878次
    • 积分:511
    • 等级:
    • 排名:千里之外
    • 原创:18篇
    • 转载:4篇
    • 译文:0篇
    • 评论:1条
    最新评论