Kenichi Maehashi's Blog

脳内コアダンプ

RSS
Category: Linux
zsh を使いたいが、ログインシェルにするのはちょっと怖い…。
.bash_profile に
exec /bin/zsh
と書いて代用する、というのはよく使われるテクニックですが、実はこの記述だと /bin/zsh が消えてしまった場合にログインできなくなります。
[ -x "/bin/zsh" ] && exec /bin/zsh
だと /bin/zsh が消えたときには exec が行われなくなるので、安全です。

… と思って使っていたのですが、先ほど自分のサーバを再起動したら帰ってこなくなりました。
理由は /etc/init.d/functions で定義される daemon コマンド(関数)に --user= オプションが指定されていた場合、"/bin/bash -c 'コマンド'" を --user= で指定したユーザのログインシェルとして起動するためです。上記の exec では(見ての通り)zsh に -c を渡していないので、もし --user=root であれば、ログインシェルとして bash が起動されて .bash_profile が実行されるので、zsh が exec されてプロンプトが出たまま起動プロセスが停止してしまいます。

で、CentOS 5.5 の起動スクリプト(のうち自分が使っているソフトウェア)で唯一 --user=root を使っているものが mdmonitor でした。mdmonitor を自動起動するように設定していたため、mdmonitor が起動するときに(本来であれば Starting mdmonitor: が表示されるべきところに)zsh のプロンプトが表示されて停止してしまい、結果として sshd の起動まで辿り着いていないという状況でした。

この問題に対処した zsh の exec 方法は、以下の通りです。
if [ -z "${BASH_EXECUTION_STRING}" ]; then
ZSH="/bin/zsh"
[ -x "${ZSH}" ] && SHELL="${ZSH}" exec "${ZSH}" -l
fi
BASH_EXECUTION_STRING という変数に -c で指定した文字列が含まれているので、-c で何も指定されていない (-z) 場合のみ、zsh を exec するようにしました。これで現状、問題なく動作しています。

Comments

Leave Yours...
Name:
E-mail / URL (optional):
Comment:
Are You Robot?: