Category:
Linux
zsh を使いたいが、ログインシェルにするのはちょっと怖い…。
.bash_profile に
… と思って使っていたのですが、先ほど自分のサーバを再起動したら帰ってこなくなりました。
理由は /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 方法は、以下の通りです。
.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}" ]; thenBASH_EXECUTION_STRING という変数に -c で指定した文字列が含まれているので、-c で何も指定されていない (-z) 場合のみ、zsh を exec するようにしました。これで現状、問題なく動作しています。
ZSH="/bin/zsh"
[ -x "${ZSH}" ] && SHELL="${ZSH}" exec "${ZSH}" -l
fi
Comments