かってきままな日々
2020-03-26 (Th) [長年日記]
_ Terminator が起動しない理由
Wayfire + Waybar を使ってて、Waybar 上のボタンをクリックして 端末の Terminator を起動するように設定してある。
が、Waybar 起動後、最初にボタンをクリックした時は問題ないのに、 2回目以降は Terminator が起動しない。
標準エラー出力に何か出てるかな、と思ってファイルにリダイレクトしてみたら、 以下の例外が発生していた。
Traceback (most recent call last):
File "/usr/bin/terminator", line 114, in <module>
TERMINATOR = Terminator()
File "/usr/lib/python2.7/site-packages/terminatorlib/terminator.py", line 72, in __init__
self.prepare_attributes()
File "/usr/lib/python2.7/site-packages/terminatorlib/terminator.py", line 97, in prepare_attributes
self.pid_cwd = get_pid_cwd()
File "/usr/lib/python2.7/site-packages/terminatorlib/cwd.py", line 42, in get_pid_cwd
system = platform.system()
File "/usr/lib/python2.7/platform.py", line 1303, in system
return uname()[0]
File "/usr/lib/python2.7/platform.py", line 1270, in uname
processor = _syscmd_uname('-p','')
File "/usr/lib/python2.7/platform.py", line 1005, in _syscmd_uname
rc = f.close()
IOError: [Errno 10] 子プロセスがありません
uname -p
を実行してる……?
なんか知らんが、Terminator は platform.system()
を使って環境がどんなシステム
なのかを取得している。そして platform.system()
は uname -p
を実行して、
パイプ経由で uname の出力を取得しているらしい。
が、f.close()
が waitpid()
してそこで子プロセスがなくて例外が発生する、と。
なんで子プロセスがないのだろう? 他のプロセスが waitpid()
してるのだろうか…
と、ここしばらく探していた。
python2.7 の platform.system()
に何か問題でもある? と思ってぐぐって見つけた。
SIGCHLD を SIG_IGN にしてるとそういうことが起きるらしい。
なるほど!!!! そりゃそうだ。忘れてた。
Waybar は最初に子プロセスを作った後、SIGCHLD を SIG_IGN に設定している。 これが原因か。exec する前に SIG_DFL に戻せば治る。
治った!!
1ヶ月程前に書いた Waybar の issue にコメント付けとこ。