LoginSignup
8
7

More than 5 years have passed since last update.

SSH 経由の sudo で TERM が unknown になって php が標準エラーに変なメッセージを吐く

Posted at

とある 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 で起動しているから)、このような問題は発生しないはずです。

8
7
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
8
7