这两天遇上了一个问题,可惜解决晚了,导致场景服务器的一个未知隐患要留到下次外部测试才能查出来了.
一个通过ssh连接启停指定服务器程序的管理程序,其中一组启动的程序发生崩溃后无法dumpcore文件,但是改用手动启动的方式程序则会在崩溃后dumpcore.
在shell环境下检测core文件大小设置:
$ulimit -c
unlimited
让管理程序读取core文件大小设置:
o = machine.StartApp('ulimit -c');
print(o.readline());
$python test.py
0
设置值是0,不是预期的.但是在终端看到的却是unlimited.其中ulimit -c的初始设置是写在.bash_profile里的.
很幸运的看到.bashrc里提到2种类型的shells:login shell,interactive shell.其中login shell加载.bash_profile,interactive shell加载.bashrc.
管理程序连接到机器后,没有使用tty或者bash,因为不需要交互,同时,管理程序执行命令的方式是bash -c,所以管理程序没有执行.bash_profile中的设置,以致于子进程继承的core文件大小设置不符合期望.
其中的一个解决办法是在每个执行命令前添加 ulimit -c unlimited,但是这写得有点死.另一个解决办法是发现bash -c每次都会加载.bashrc,将core文件大小设置写入.bashrc便可.
问题看起来解决了,但是我觉得这里面的一个细节和man对不上:
An interactive shell is one started without non-option arguments and without the -c option whose standard input and error are both connected to
terminals
管理程序执行命令时候的bash -c表示的是non-interactive shell,应该不会加载.bashrc才是,类似于用crontab运行的脚本就不会加载.bashrc,但是管理程序执行命令的时候设置竟然生效了...求解.
.
PS:最近2个月没写blog,好忙.................
posted on 2010-12-20 23:07
LOGOS 阅读(2131)
评论(2) 编辑 收藏 引用