/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文件了。

时间: 2024-08-08 13:29:00

/etc/profile与/etc/bashrc、交互式与非交互式、login与non-login shell的差别的相关文章

/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

登录式与非登录式&交互式与非交互式shell及其环境初始化过程

交互式shell和非交互式shell(interactive shell and non-interactive shell) 交互式模式就是在终端上执行,shell等待你的输入,并且立即执行你提交的命令.这种模式被称作交互式是因为shell与用户进行交互.这种模式也是大多数用户非常熟悉的:登录.执行一些命令.退出.当你退出后,shell也终止了. shell也可以运行在另外一种模式:非交互式模式,以shell script(非交互)方式执行.在这种模式 下,shell不与你进行交互,而是读取存

交互式与非交互式,登录shell与非登录shell

交互式shell和非交互式shell.登录shell和非登录shell的区别.首先,这是两个不同的维度来划分的,一个是是否交互式,另一个是是否登录. 交互式shell和非交互式shell(interactive shell and non-interactive shell)交互式模式就是在终端上执行,shell等待你的输入,并且立即执行你提交的命令.这种模式被称作交互式是因为shell与用户进行交互.这种模式也是大多数用户非常熟悉的:登录.执行一些命令.退出.当你退出后,shell也终止了.s

浅析mysql交互式连接&非交互式连接

https://www.jb51.net/article/81462.htm https://blog.csdn.net/andypan1314/article/details/77930677 (1)interactive_timeout: 服务器关闭交互式连接前等待活动的秒数(2)wait_timeout: 服务器关闭非交互连接之前等待活动的秒数.两者生效取决于:客户端是交互或者非交互的连接.在交互模式下,interactive_timeout才生效:非交互模式下,wait_timeout生

mysql交互式连接&非交互式连接

交互式操作:通俗的说,就是你在你的本机上打开mysql的客户端,就是那个黑窗口,在黑窗口下进行各种sql操作,当然走的肯定是tcp协议. 非交互式操作:就是你在你的项目中进行程序调用.比如一边是tomcat web服务器,一边是数据库服务器,两者怎么通信?在java web里,我们通常会选择hibernate或者是jdbc来连接.那么这时候就是非交互式操作. 参考:MySQL中 timeout相关参数解析 http://www.cnblogs.com/cenalulu/archive/2012/

交互式shell和非交互式shell、登录shell和非登录shell的区别

交互式shell和非交互式shell.登录shell和非登录shell的区别.首先,这是两个不同的维度来划分的,一个是是否交互式,另一个是是否登录. 交互式shell和非交互式shell(interactive shell and non-interactive shell)交互式模式就是在终端上执行,shell等待你的输入,并且立即执行你提交的命令.这种模式被称作交互式是因为shell与用户进行交互.这种模式也是大多数用户非常熟悉的:登录.执行一些命令.退出.当你退出后,shell也终止了.s

shell脚本分为三类:登录脚本、交互式脚本、非交互式脚本

一. 登录脚本类似于windows下的计算机设置中的登录脚本和账户设置下的登录脚本的合集(我是这么理解的哈). 其配置文件的关键词为prefile,它有以下几个关键配置文件: /etc/prefile 这个是计算机脚本; [$home/.prefile ; $home/.bash_prefile ; $home/.bash_login]这三个是账户脚本,根据不同发行版名字不同(坑爹的linux) ; 说明:/etc/prefile之所以这么牛逼,应该与其内部含有export有关,export定义

(转)SSH批量分发管理&非交互式expect

目录 1 SSH批量分发管理 1.1 测试环境 1.2 批量管理步骤 1.3 批量分发管理实例 1.3.1 利用sudo提权来实现没有权限的用户拷贝 1.3.2 利用sudo提权开发管理脚本 1.3.3 利用rsync来实现增量备份 1.4 SSH批量管理分发脚本实战 1.5 SSH批量管理总结 2 非交互式expect 2.1 非交互式生成密钥及实现批量管理 2.2 一键批量安装httpd服务 2.3 一键自动化50台规模集群网站 1 SSH批量分发管理 基于口令的,如何实现批量管理:expe

/etc/profile、/etc/bashrc、~/.bash_profile、~/.bash_bashrc

bashrc与profile的区别: 要搞清bashrc与profile的区别,首先要弄明白什么是交互式shell和非交互式shell,什么是login shell 和non-login shell. 交互式模式就是shell等待你的输入,并且执行你提交的命令.这种模式被称作交互式是因为shell与用户进行交互.这种模式也是大多数用户非常熟悉的:登录.执行一些命令.签退.当你签退后,shell也终止了. shell也可以运行在另外一种模式:非交互式模式.在这种模式下,shell不与你进行交互,而