你好,欢迎来到电脑编程技巧与维护杂志社! 杂志社简介广告服务读者反馈编程社区  
合订本订阅
 
 
您的位置:技术专栏 / Linux开发
/etc/profile与/etc/bashrc、交互式与非交互式、login与non-loginshell的区别
 
线上的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文件了。
  推荐精品文章

·2024年9月目录 
·2024年8月目录 
·2024年7月目录 
·2024年6月目录 
·2024年5月目录 
·2024年4月目录 
·2024年3月目录 
·2024年2月目录 
·2024年1月目录
·2023年12月目录
·2023年11月目录
·2023年10月目录
·2023年9月目录 
·2023年8月目录 

  联系方式
TEL:010-82561037
Fax: 010-82561614
QQ: 100164630
Mail:gaojian@comprg.com.cn

  友情链接
 
Copyright 2001-2010, www.comprg.com.cn, All Rights Reserved
京ICP备14022230号-1,电话/传真:010-82561037 82561614 ,Mail:gaojian@comprg.com.cn
地址:北京市海淀区远大路20号宝蓝大厦E座704,邮编:100089