這兩天遇上了一個問題,可惜解決晚了,導致場景服務器的一個未知隱患要留到下次外部測試才能查出來了.
一個通過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 閱讀(2162)
評論(2) 編輯 收藏 引用