问题:要开coredump功能,需要把core file size的软限制值由0改为一个大于0的值,一般取unlimited。
有两个方法可以改变这个值,一个是ulimit命令,执行ulimit –c unlimited,可把core file size值设置为unlimited,但这只对当前shell有效;另一个是修改/etc/security/limits.conf文件,在该文件中加入如下格式的一句话:
<domain> <type> <item> <value>
如,
win7 soft core unlimited
这样,当win7用户开启shell时,其core file size 值会自动设置为unlimited。如果把win7换成*,则以上配置对所有用户有效。
我们有一个程序要开机运行,因此把/home/root/tss256 放在rc.local中,开机后会自动执行该程序。在实验过程中,该进程会突然退出,为了方便查找原因,我们选择使用coredump技术来保存进程退出时的内存状态。
如果采用改变limits.conf文件的方法,rc.local执行时,其运行环境是shell么?如果是,是哪个用户开启的shell呢?
一,rc.local执行时的运行环境是 shell么?
1,什么是shell呢?
shell是一个程序,常用的shell是Bash shell,程序为/bin/bash。shell读取用户输入的命令,并执行相应的应用程序以响应命令(由环境变量PATH决定搜索应用程序的路径),因此,我们可以把shell理解为一种命令解释器,或者一种类似vs2008的开发环境。
当一个shell启动时,系统会根据不同的启动方式判断shell类型,并读取不同的配置文件(见下文),并根据这些配置文件为将要启动的shell配置环境变量(不同的配置文件导致不同的环境变量)。
环境变量用于描述当下的shell环境。比如,USER表示当前shell所属的用户,$表示当前shell的PID号,PPID表示当前shell的父进程的PID号,SHELL表示当前shell是执行的哪个程序(因为shell也是一个程序,一般为/bin/bash),HISTSIZE表示当前shell可以存储的历史命令的最大个数。(参考《鸟哥私房菜》)。用printenv命令可以打印全部的环境变量。
因此,判断rc.local里内容执行时是否是在一个shell中执行,只需在rc.local中查看SHELL变量的值即可,在rc.local中加入echo $SHELL。
经验证,rc.local中,SHELL=/bin/bash,因此rc.local是在bash shell环境中执行的。
然而,这跟我们平时对shell的印象不太一样,平时启动shell时都是通过某个用户登录linux后,然后右击桌面,选择打开终端,这就是一个shell,又或者通过ssh,输入用户名和密码远程登录Linux,启动的就是一个shell。很明显,rc.local的执行跟我们印象中的shell不一样。
2,shell的类型有哪些呢?
shell按照登录与否,可分为登录式shell和非登录式shell;按照能否与用户交互与否,可分为交互式shell和非交互式shell。
(1)登录式shell
输入用户名和密码后,启动的shell就是登录式shell,比如sshd远程登录,又比如在本地Linux登录界面输入用户名密码登录。
(2)非登录式shell
与登录式shell相比,它不需要输入用户名密码即可启动。其一般是在shell中输入bash命令,或者本地登录Linux登录界面后,右键桌面->打开终端开启的shell。
登陆式shell和非登陆式shell启动时读取的配置文件不太一样。登录式shell启动时,系统会按照以下顺序读取配置文件,并进行相应的设置。
Ø /etc/passwd
系统会据此判断系统上是否有输入的用户名,如果有,则获取其UID,GID,以及将要启动的shell是哪个程序。下面内容截取自/etc/passwd:
root:x:0:0:root:/root:/bin/bash
win7:x:500:500:win7:/home/win7:/bin/bash
第一句表示,系统有root这个用户,其密码用x表示,UID为0,GID为0,全名为root,家目录(即执行cd命令时进入的目录)为/root,启动的shell程序为/bin/bash程序。
第二句表示,系统有win7这个用户,其密码用x表示,UID和GID均为500,家目录为/home/win7,启动的shell程序为/bin/bash程序。
Ø /etc/shadow
该文件记录的每个用户的密码,下面内容截取自该文件:
root:$6$H/KS4EYo0ZSZmTC8$xTMs4cAeWbQkpzHT8lB/75qerzpWlvxsF6XW9JwVzJyHEDiKcCdKu7cooUrut5NUE1wa1drb9C8KXiGXAPY021:17238:0:99999:7:::
win7:$6$y1OyG8nlGdeqeao0$iPKvObi273nm5/9krOp9CMOhj7Ngux/9gPbj/5bLw24p7rgjzm4StLDu/.3lVewgGFmdP2Za/fvYeIFSgXsQx0:17238:0:99999:7:::
上文中用户名后面那串字符即是密码,显然已经加密。在/etc/passwd中检查到用户存在后,系统会判断输入的密码与记录的密码是否一致。
Ø /etc/profile
系统为用户启动相应的shell程序(一般为/bin/bash)后,会自动读取该文件,并设置以下环境变量(export命令使自定义变量变为环境变量):
export PATH USER LOGNAME MAILHOSTNAME HISTSIZE HISTCONTROL
Ø $HOME/.bash_profile
此处,$HOME表示家目录,在/etc/passwd中得到。注意,不同用户的家目录不一样,这就实现了不同用户可以配置不同的shell环境变量。
在该文件中,要执行./.bashrc。
Ø $HOME/.bashrc
该文件中执行/etc/bashrc
Ø /etc/bashrc
该文件会对PROMPT_COMMAND变量、PATH变量、umask值进行设置。
注意:由pstree –npu命令可知,从/etc/profile至/etc/bashrc六个文件的权限均为:
-rw-r--r—
也就是说,这些文件并非shell脚本,都是在系统为用户启动相应的shell后,系统自动读取并使其生效的文件。猜测,类似于在该shell中执行:
source/etc/profile
source$HOME/.bash_profile
source$HOME/.bashrc
source/etc/bashrc
交互式shell只生效上述的$HOME/.bashrc、/etc/bashrc文件。可以在以上5个文件中加入打印信息,分别启动登陆式shell和非登陆式shell,即可得知该结论。
(3)交互式shell
顾名思义,交互式shell能与用户进行交互,用户在输入命令,shell会执行该命令并返回执行结果,我们用的shell一般都是这种类型。
(4)非交互式shell
与交互式shell相反,其不能与用户进行交互,其实际是运行中的shell脚本。
综上所述,rc.local是一个shell脚本,其运行环境是一个非登录式非交互式shell。
其实,还可以从另一个角度得出以上判断,那就是shell脚本的第一行必须写这句话:
#!/bin/bash
在shell脚本中,这一行的“#”并非注释的意思,而是告诉系统执行该脚本时应该调用/bin/bash程序,即选择bash shell作为该脚本的运行环境。打开rc.local,第一句就是#!/bin/bash,因此可以判断rc.local是一个shell脚本。
二,该shell的所属的用户是谁
为了知道该shell的用户,我们在rc.local中加入echo $USER命令,但结果显示为空,即该shell环境中没有这个变量。因此,这个shell环境不属于任何用户。
其实通过推理也可以得出这个结论,因为执行rc.local时还没有用户进行登录。
既然rc.local执行时,其shell环境没有用户,因此,通过改变limits.conf来设置core file size 值的方法不可行。只能在rc.local中加入命令ulimit -c unlimited。然而,为什么在登陆式交互式shell中,即ssh登陆或者本机登陆Linux系统后,查看ulimit –a ,core file size值依然为0呢?这是因为ulimit 只能改变当前shell环境中的值,虽然rc.local这个非交互式shell并没有停止运行,但其与当前的shell是两个不同的环境。