テストを実行するとログインシェルから追い出される問題 #57

公開日: 2014-05-11


激しく複雑なテストを、普段とは異なる環境で実行する必要が生じた。いろいろはまりポイントがあるんだろうなあと思って、おそるおそる実行してみると、起動しない。

コンフィグレーションがどうこうというエラーメッセージが出るので、まずその辺を適当に設定してクリア。すると、今度はクラッシュする。クラッシュするコードパスを調べて、そこを通らないようにするワークアラウンドを発見して突破。

すると、今度は、テストが途中で終了してしまう。さらに不思議なことに、ログインシェルの bash ごと終了して、シェルから追い出されてしまう。gdb 上で実行しても同じ。gdb も bash もテストとともに終わってしまう。なぜそんなことが?

仕方がないので、root でログインして、一般ユーザに sudo するところから strace をかけてみると、bash もテストも、 SIGKILL で息の根をとめられていることがわかった。が、シグナルの送り主はわからない。

その他のプロセスを眺めると、ひとつあやしいやつがいるので、これを SIGKILL で終了してみると、すぐに立ち上がってしまう。再起動するスクリプトがどこかにあるはずだ。

さっそく、そのスクリプトを見つけて適当にいじって再起動を阻止すると、今度はいろいろなものが動かなくなってしまった。仕方がないのでスクリプトを元に戻す。

万策尽きたか、と思ったが、そういえば、プロセスを一時停止状態にする SIGSTOP なんていうシグナルがあったなと思い出して、くだんのプロセスに試しに SIGSTOP を送ってやる。そして、おもむろにテストを動かすと、止まらずに先に進み始めた!

と思ったら、今度はタイムアウトで終了。原因を調べると、SIGSTOP で止められているプロセスとの IPC が失敗するからであった(止まっているのだから IPC の返事をしようがない)。これは本格的にコードを修正しないと直りそうもない。

ともあれ、テストを実行するとログインシェルから追い出されるという謎の現象は解明できたので、よしとする。SIGSTOPが意外なところで役に立って助かった。

Satoru Takabayashi