* xdmセッションが他のセッション終了時に終了する [#bf183e18]
メッセージ †
runlevelを4にしてxdmでログインしている環境に、別ホストからsshで接続して、sshの接続をlogoutすると
xdmの環境も終了してログイン画面に戻ってしまう。console-kit か dbus-launch あたりの問題?
- runlevel 4 だと、xdm経由のログインは$SHLVL 2 になって、外部からssh でログインすると $SHLVL 1になるから、sshのログアウト時に~/.*logout で pulseaudio と dbus を殺してしまうのが原因らしい。 -- kojima
- よく見ると、~/.*login 時にはesdを起動しているのに、~/.*logout時にはpulseaudioとdbusを殺しているな。~/.*logout側の処理は無くした方がよさげ。 -- kojima echo $SHLVL
2
kojima@vm50:~$
- でも、xdm経由だと$SHLVLが2になるなら、xdmからAfterstep/Qvwmを上げるような環境だとesd/pulseaudioは起動できないな。 -- kojima
- consoleだけで音楽を鳴らす、というのを特例にして、~/.xinitrcの方で起動するようにしたほうがいいのかな? -- kojima
- 起動している実体は,pulseaudioとdbusなので,~/.*login 時にesdを起動して,~/.*logout時にpulseaudioとdbusを殺しているのは,それで合ってます。ログアウト時に,xdmな環境を考慮する方向で検討してみませう。 -- tamu
- xdmな環境は普段使ってないので良く分かってないけど,xdm経由だと~/.*loginを実行しないんでしたっけ。 -- tamu
- 確か、~/.*login は飛ばして、~/.xsession を実行するはず。 -- kojima
- なるほど。おそらくxdmな環境では,同じユーザの最後の1人だとしても,~/.*logout時にpulseaudioとdbusは殺しちゃいけないってことだろうから,/etc/inittabあたりを参照して,ランレベル4だったら何もしない,とすれば良さげな感じ。ところで,ランレベル5って何だっけ? -- tamu
- でも,ユーザが誰もいなくなっても,そのユーザのpulseaudioとdbusが残っているって,なんか変な感じ。本当は,xdm起動時にオールマイティなpulseaudioとdbusを起動して,シャットダウン時までそのまま,というのが正しいのかも。 -- tamu
- dbusが使えればpulseaudioは自動的に起動/終了するはずなので、特に何もする必要はないはず。問題なのはdbus無しでサウンドを使おうとする時だけなので、その条件を例外扱いする方が簡単でないかい? -- kojima
- 自動的に起動するけど,終了はしないような。ユーザA,ユーザB,ユーザCがそれぞれログインして,全員がログアウトした後で,別のユーザDがログインすると,ユーザA,ユーザB,ユーザC,ユーザDそれぞれのdbusとpulseaudioが動いたままになってるのが見えると思います。> 何もしなかった場合 -- tamu
- で,ランレベル5って,Plamoでは何かに使ってましたっけ。 -- tamu
- 特に使ってないはず > ランレベル5 -- kojima
- 了解です。あと,xdm経由でloginしている状態で,別途sloginしてlogoutすると,xdm経由のloginもクローズされてしまうとのことだけど,このxdm経由のloginの人が使っていたdbusとpulseaudioの持ち主は,xdm経由のloginの人のものですよね。別途sloginした人が同じログインユーザだとしても,ログアウト時に同じログインユーザが残っている限り,dbusとpulseaudioを殺さないはずですが($SHLVL=1やら$SHLVL=2の同じ人が複数いる中で,$SHLVL=1の人が1人抜けても殺しはしないってこと)。ひょっとして,xdm経由のloginの人は,wコマンドなどで同じログインユーザとして見えてないってことですか? -- tamu
- ちなみに,~/.*logoutで$SHLVL=1のチェックを入れているのは,同じユーザが自分1人だけのとき,$SHLVL>=2の状況で殺さないようにするため($SHLVLが上がっても,同じユーザが1人なことには変わりない)。 -- tamu
- 確かにw -h $USERなチェックをしているから、落ちるのはおかしいな、と仮想環境上のスナップショットを戻して確認したら落ちなくなっているですね。きちんとログをとってなかったのでうろ覚えだけど、落ちてたころはck-list-sessionsを見ると、2つのセッションが動いていたけど、今見るとsshで外部から接続していてもセッションは一つだけ(xdm経由でログインしたセッションだけ)になっている模様。 -- kojima
- xdm-1.1.10だとpam.d/xdmがないからログインできないことをチェックして、xdm-1.1.11に更新したらログインできるようになったのだけど、その際にリブートしたかの記憶があやふやなので、xdmのアップデートでキャッシュの状態とかがうまく更新できてなかったのだろうか? -- kojima
- いや、違うか。むしろ、xdm経由のログインだと w に出てこないみたいだ。
kojima@vm50:~$ who
kojima@vm50:~$ w
20:30:25 up 42 min, 0 users, load average: 0.41, 0.14, 0.21
USER TTY LOGIN@ IDLE JCPU PCPU WHAT
kojima@vm50:~$ echo $SHLVL
2
kojima@vm50:~$
しかも、xdm経由のログインだと$SHLVLが2になるから、ssh で外部から接続すると
$SHLVL=1という条件もwで1ユーザという条件も満たすから、~/.bash_logout でpulseaudioとdbus-daemonを殺すのが
正しい動作になりそうな。。-- kojima
- 外部からsshで接続した状態で、xdmで起動した環境で見ると pts/1経由の接続が見える
kojima@vm50:~$ who-- [[kojima]] &new{2011-12-07 (水) 20:48:33};
kojima pts/1 2011-12-07 20:32 (192.168.1.5)
kojima@vm50:~$ w
20:34:16 up 46 min, 1 user, load average: 0.02, 0.08, 0.18
USER TTY LOGIN@ IDLE JCPU PCPU WHAT
kojima pts/1 20:32 1:56 0.01s 0.01s -bash
この状態だと、ssh側の接続をlogoutすると~/.bash_logoutでpulseaudioとdbus-daemonを殺すのが正しい動作な
気がするが如何? -- kojima
- あー、xdmで起動した環境から手動でdbus-daemonを殺そうとすると、
kojima@vm50:~$ killall dbus-daemon pulse-audio
dbus-daemon(2686): 許可されていない操作です
dbus-daemon: no process found
pulse-audio: no process found
kojima@vm50:~$ ps auxw | grep 2686
25 2686 0.0 0.0 13340 1412 ? Ss 19:48 0:00 dbus-daemon --system
となるから、システム起動時に起動されたdbus-daemonは(root権限で動いているから)殺せないけど、
dbusをインストール後、再起動せずに非root権限で動いていたdbus-daemonはsshのlogout時に殺されちゃって、
道連れにxdmのセッションも落ちてしまう、ということっぽいな。 -- kojima
- おそらくこの現象は、起動時にdbusがない環境に、dbusパッケージを追加インストールして、再起動せず-- kojima に使っている時のみに起きる現象だから無視してもいいとは思うけど、むしろxdm経由だとユーザがwに表示されない(wtmpが更新されない)というのが問題っぽいな。xdmの設定にそういう指定があるのだろうか? -- kojima
- もうしばらく追いかけてみたけど、どうも xdm 経由でのloginがwtmp/utmpに記録されないのが原因っぽい。gdm経由にすると、
kojima@vm50:~$ w
22:50:45 up 1 min, 2 users, load average: 1.06, 0.36, 0.13
USER TTY LOGIN@ IDLE JCPU PCPU WHAT
kojima :0 22:50 ?xdm? 14.65s 0.00s ck-launch-session dbus-launch --exit-with-session startxfce4
kojima pts/1 22:50 0.00s 0.00s 0.00s w
みたいな感じで、DM経由のログイン(TTY :0)も記録されるのだけど、xdm経由だとこのログインが出てこない(wtmpに記録されない)模様。
xdm自体にはwtmp/utmpを操作する機能はなくて、/usr/lib64/X11/xdm/Xstartup にある
#!/bin/sh
# Register a login (derived from GiveConsole as follows:)
#
exec /usr/bin/sessreg -a -w /var/log/wtmp -u /var/run/utmp -x /usr/lib64/X11/xdm/Xservers -l $DISPLAY -h "" $USER
というコマンドでwtmp/utmpを操作するみたいなんだけど、このsessregが正しくユーザをwtmp/utmpに登録してくれないのが原因っぽい -- kojima
- 問題はxdmとsessregあたりに絞れてきたので、こっちはいったん閉じて、別ページを開きます。 -- kojima