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

原创 2015年07月09日 17:56:55
线上的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文件了。
版权声明:本文为博主原创文章,未经博主允许不得转载。

相关文章推荐

Nginx 配置详解 一!

Nginx的配置文件nginx.conf配置详解如下:   user nginx nginx ; Nginx用户及组:用户 组。window下不指定   worker_processes 8; 工作进...

valse2016参会总结

很幸运参加了今年的valse年度盛会,valse是全球计算机视觉,模式识别,机器学习,多媒体技术等相关领域华人青年学者最具影响力的交流平台。随着valse名气越来越大,今年报名也特别火爆,早早就被注册...

Linux Shell Bash 交互与非交互式脚本

http://blog.163.com/howl_prowler/blog/static/266197152009524105126976/

环境配置文件 ① /etc/profile、② ~/.bash_profile、③ ~/.bashrc、④ /etc/bashrc 作用与执行顺序,以及与login/nonlogin关系

有效期与环境配置文件 1.有效期 默认情况下,在shell下的用户变量、alias等,只在此次登录中有效。一旦关闭终端或注销后,则将会设置恢复初始值。 用户可以将这些设置放入一个系统环境配置...

/etc/profile ~/.bashrc区别

安装jdk,vim,apache,nginx,php,mysql时,需要修改/etc/profile ~/.bashrc等配置文件,把几个文件的作用放到一起,对比理解。...

Linux下.bashrc文件和/etc/profile文件的区别

bashrc与profile的区别 要搞清bashrc与profile的区别,首先要弄明白什么是交互式shell和非交互式shell,什么是login shell 和non-login shell。...

/etc/profile、~/.bashrc、/etc/bashrc、~/.bash_profile、 ~/.bash_login、 ~/.profile、/etc/environment

在登录Linux时要执行文件的过程如下: 在刚登录Linux时,首先启动 /etc/profile 文件,然后再启动用户目录下的 ~/.bash_profile、 ~/.bash_login或 ~/...

关于shell启动时调用的几个配置文件/etc/profile .profile .bash_profile .bashrc等

linux下以.开头的文件为隐藏文件,今天和同事探讨了下.profile,查了下资料,记录一下。 原帖:http://www.linuxdiyf.com/bbs/thread-312980-...

登录/非登录、交互/非交互式shell

登录与非登录shell的区别: 直观区分方式:是否需要输入用户名密码。 转换: 非登录可以转换成登录 使用--login 考虑转换情况,相对科学的区分:既不使用密码,也不使用--login转换的是非登...

理解RHEL上安装oracle的配置参数 :/etc/security/limits.conf, /etc/profile, /etc/pam.d/login

无论安装什么版本的oracle,在安装之前,都需要配置 /etc/pam.d/login   /etc/profile   /etc/security/limits.conf这三个文件     ...
  • halou90
  • halou90
  • 2015年10月30日 13:59
  • 2164
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:/etc/profile与/etc/bashrc、交互式与非交互式、login与non-login shell的区别
举报原因:
原因补充:

(最多只允许输入30个字)