とある Apache のインプロセスの mod_php
から sudo
して php
コマンドを実行するシステムがあるのですが、ある日、突然 php
コマンドの標準エラーに、
No entry for terminal type "unknown";
using dumb terminal settings.
なんてものが出力されるようになりました。
原因
PHP は CentOS 6 の php-5.3.3-46.el6_6.x86_64
を使っていたのですが、TERM
が変な値だと標準エラーにメッセージが出力されました。
$ TERM=unknown php -v
No entry for terminal type "unknown";
using dumb terminal settings.
PHP 5.3.3 (cli) (built: Jul 9 2015 17:39:00)
通常、ほとんどの環境変数は sudo
されたプロセスには引き継がれません。が、TERM
などの一部の環境変数はデフォで引き継がれます。
$ TERM=hoge sudo -u ore env | grep TERM
TERM=hoge
つまり、元プロセスである Apache の TERM
環境変数が unknown
となっていることが原因でした。
$ sudo cat /proc/$(sudo cat /var/run/httpd/httpd.pid)/environ | tr '\0' '\n' | grep TERM
TERM=unknown
Apache を再起動してみたところ xterm
になりました。
$ sudo service httpd restart
Stopping httpd: [ OK ]
Starting httpd: [ OK ]
$ sudo cat /proc/$(sudo cat /var/run/httpd/httpd.pid)/environ | tr '\0' '\n' | grep TERM
TERM=xterm
xterm
なら変なメッセージは表示されませんでした。
$ TERM=xterm php -v
PHP 5.3.3 (cli) (built: Jul 9 2015 17:39:00)
サーバのリブート直後だと TERM=linux
でした。
$ sudo reboot
...
$ sudo cat /proc/$(sudo cat /var/run/httpd/httpd.pid)/environ | tr '\0' '\n' | grep TERM
TERM=linux
linux
でも大丈夫でした。
$ TERM=linux php -v
TERM=linux php -v
PHP 5.3.3 (cli) (built: Jul 9 2015 17:39:00)
つまり、普通に Apache を起動したり再起動したりする分には、この問題は発生しないはずです。
もっと根本的な原因
そもそも、なぜ TERM=unknown
なんてことになっていたのか、その原因を探ったところ、SSH 経由で sudo
すると TERM=unknown
になることがわかりました。
$ ssh localhost sudo env | grep TERM
TERM=unknown
さらに、service
コマンドを使っていても環境変数 TERM
はサービスに引き継がれます。
つまり、SSH 経由で sudo
してサービスを再起動したことが原因でした。
$ ssh localhost sudo service httpd restart
Stopping httpd: [ OK ]
Starting httpd: [ OK ]
$ sudo cat /proc/$(sudo cat /var/run/httpd/httpd.pid)/environ | tr '\0' '\n' | grep TERM
TERM=unknown
Ansible から Apache を再起動すると SSH 経由の sudo
経由になるので、それが原因だったのかもしれません。
$ ansible-playbook ore-no-playbook.yml -t apache
:
:
:
$ sudo cat /proc/$(sudo cat /var/run/httpd/httpd.pid)/environ | tr '\0' '\n' | grep TERM
TERM=unknown
解決方法
とりあえず /etc/sysconfig/httpd
に次の通りに追記することにしました。
TERM=linux
(なぜか export しなくても大丈夫・・なぜ?)
さいごに
PHP をソースからビルドしている別の環境だと発生しなかったので、PHP で有効になっている拡張とかによってことなるのかもしれません。
なお、この問題が発生したのは CentOS 6 でしたが、CentOS 7 なら端末の環境変数なんてサービスには関係ないはずなので(systemd で起動しているから)、このような問題は発生しないはずです。