sshから切断するとtmuxセッションが強制終了される


23

要約:sshから切断するとtmuxセッションが停止する理由を理解しようとしています。

詳細

Arch Linuxシステムにtmuxをインストールしています。tmuxセッションを開始すると、sshセッションがアクティブな間に、セッションをデタッチしてから再度アタッチできます。しかし、sshセッションを終了すると、tmuxセッションは強制終了されます。

sshセッションが終了してもtmuxセッションが実行され続け、新しいssh接続を確立した後にtmuxセッションに接続できる他のシステムがあるため、これは通常の動作ではないことを知っています。問題のあるシステムと正しく動作するシステムの構成は非常に似ているため、何を確認すればよいかわかりません。

tmuxバージョン1.9aを実行しています。問題のあるシステム(ルートアクセス権がある)にはLinuxカーネルバージョン3.17.4-1があり、正常に動作するシステムにはカーネルバージョン3.16.4-1-ARCHがあります(ルートにアクセスできません)システム)。カーネルバージョンが問題の原因であるとは思いませんが、それは私が気づいた違いの1つにすぎません。

私は誰かが同様の問題を見て、可能な解決策を知っているかどうかを確認したいと思った。

問題につながる正確な手順は次のとおりです。

  1. sshからマシン
  2. tmuxtmuxを起動するために実行します
  3. ctrl-B D デタッチする(この時点で、再アタッチできました tmux attach
  4. sshセッションを閉じます(この時点でtmuxセッションは強制終了されます。別の端末でrootとしてログインしているときにこれを確認できました)
  5. sshで再接続して実行するtmux attachと、メッセージが表示されno sessionsて実行tmux lsが戻りますfailed to connect to server: Connection refused。サーブが実行されていないため、これは理にかなっています。私にとって意味がないのは、sshセッションから切断すると、手順4で強制終了される理由です。

痕跡データ:

コメントの1つに応えて、straceを使用して、tmuxサーバープロセスが呼び出すシステムを確認しました。sshセッションを(入力exitまたはを使用してctrl-d)終了すると、tmuxプロセスが強制終了されているように見えます。strace出力の最後の部分のスニペットを次に示します。

poll([{fd=4, events=POLLIN}, {fd=11, events=POLLIN}, {fd=6, events=POLLIN}], 3, 424) = ? ERESTART_RESTARTBLOCK (Interrupted by signal)
--- SIGTERM {si_signo=SIGTERM, si_code=SI_USER, si_pid=1, si_uid=0} ---
sendto(3, "\17", 1, 0, NULL, 0)         = 1
+++ killed by SIGKILL +++

これをtmuxが正常に動作する別のシステムと比較しました。そのシステムでは、終了した後もtmuxプロセスが実行され続けます。そのため、根本的な原因は、sshセッションを閉じたときにtmuxプロセスが終了しているようです。トラブルシューティングに時間を費やして理由を特定する必要がありますが、straceの提案が有用だったため、質問を更新すると思いました。


確かに、ステップバイステップで説明してください:私はあなたがsshであると仮定し、tmuxセッションを開始し、セッションからデタッチし、shhを閉じます:再びsshすると、tmixセッションに再参加する方法はありませんか?つまり、セッションはもう実行されていませんか?
オリビエデュラック14

@OlivierDulacはい、あなたの仮定は正しいです。また、質問を編集して、これらの詳細を含めました。
ガブリエルサザン14

sshセッションをどのように閉じますか?straceをtmuxのpidとsshdのpidに接続して、ssh接続を閉じるときに何かを受信するかどうかを確認できます(非常に冗長、ファイルにリダイレクト)
Olivier Dulac 14

@OlivierDulac提案に感謝します。質問をstraceからの情報で更新しました。sshセッションを終了すると、tmuxサーバープロセスが強制終了されるようです。これが起こるとは思わないので、なぜ起こっているのかを理解する必要があります。
ガブリエルサザン14

詳細ログを有効にしてtmuxを起動し、切断時にログに何かが出力されるかどうかを確認します。また、tmux内外のリモートマシン上のTERMは何ですか?
jasonwryan

回答:


16

理論

systemdを含む一部のinitシステムは、サービスに属するすべてのプロセスを強制終了する機能を提供します。サービスは通常、フォークによってより多くのプロセスを作成する単一のプロセスを開始し、それらのプロセスも同様にそれを行うことができます。通常、このようなプロセスはすべてサービスの一部と見なされます。systemdでは、これはcgroupsを使用して行われます。

systemdでは、デフォルトでサービスが停止されると、サービスに属するすべてのプロセスが強制終了されます。SSHサーバーは明らかにサービスの一部です。サーバーに接続すると、SSHサーバーは通常分岐し、新しいプロセスがSSHセッションを処理します。SSHセッションプロセスまたはその子から分岐することにより、画面tmuxを含む他のサーバー側プロセスが開始されます。

キルモードとソケットのアクティベーション

デフォルトの動作は、KillModeディレクティブを使用して変更できます。上流プロジェクトには.serviceファイルが含まれていないため、それらは配布によって異なります。通常、システムでSSHを有効にするには2つの方法があります。1つは、ssh.serviceネットワークでリッスンしている長時間実行されるSSHデーモンを維持するクラシックです。処理ソケットの活性化を介して、他のIS ssh.socketそのターンの開始におけるsshd@.service単一SSHセッションに対して実行されます。

解決策

セッションの終了時にプロセスが強制終了される場合、ソケットアクティベーションを使用している可能性があり、SSHセッションプロセスが終了したことに気づいたときにsystemdによって強制終了されます。その場合、2つの解決策があります。1つは、のssh.service代わりにを使用してソケットのアクティベーションを使用しないようにすることですssh.socket。もう1つはKillMode=process、のServiceセクションで設定することですssh@.service

このKillMode=process設定は、サーバーが停止または再起動されたときにssh.serviceSSHセッションプロセスまたは画面またはtmuxプロセスを強制終了しないようにするため、クラシックでも役立ちます。

今後の注意事項

この回答は明らかに人気を獲得しました。OPで機能していましたが、systemd-logindの 開発または設定のために、将来誰かのために機能しない可能性があります。この回答の説明とは異なる動作が発生する場合は、ログインセッションのドキュメントを確認してください。


ダウンボーターからの具体的なフィードバックまたはただのトローリング?
パベルシメルダ14

3
詳細な対応ありがとうございます。sshd.serviceに切り替えると問題が修正されました。
ガブリエル南部

私が使用しているシステム上で、この問題が発生するinitのではなくsystemd。しかし、とにかく少し異なります。私の質問をご覧ください。
ゲリット

5

SSHのソケットアクティベーションでsystemdを使用しますか?

もしそうなら、それに関する既知の問題があります。systemdの支持者によると、これは実際には機能です。セッションが終了すると、systemdはセッションによって生成されたすべてのプロセスを強制終了します。(私はそれが有用であることを見ることができますが、GNU screen、またはのtmux場合、あなたは間違いなくそれを望んでいませんusersもちろん、ユーザーがバックグラウンドプロセスを実行する他のほとんどの場合では。)

その場合、からsshd.socketに切り替えてみてくださいsshd.service


1
ユーザーがログアウト後に実行されているプロセスの実行を許可されている場合、通常、SSHログインにこの機能を使用したくないと思います。これは、screenやtmuxに固有のものではなく、SSH(サーバー側のバックグラウンドプロセス)に固有のものです。
パベルシメルダ

2
@PavelŠimerdaはい、それは暗黙的だと思っていましたが、今ではより明確にするために投稿を編集しました。
ミラビロス14

3

Ubuntu 16.04(kde neon)のtmuxと画面で同じ問題が発生していました。sshセッションが切断されたとき、画面/ tmuxは終了しました。

要するに、systemdはデフォルト設定をkilluserprocess = yesに変更したため、sshセッションを終了すると、それによって作成されたすべてのプロセスが終了します。

簡単な修正(何時間も試してから)このコマンドを使用してscreen / tmuxを実行します

スクリーン用

systemd-run --scope --user screen

Tmuxの

systemd-run --scope --user tmux

エイリアスを作成して簡単にすることができます

alias tmux= "systemd-run --scope --user tmux"


-bash: systemd-run: command not foundRed Hat Enterprise Linux Server release 6.8 (Santiago)
ジェリット

これは、ルートを取得していないときに機能しますか?
gerrit

1
望ましくないtmux / screen killing動作がUbuntu 18.04 LTSでは発生せず、16.04のみであることに気付きました。
セス

2

からsshd.socketに移行する必要のない別の解決策sshd.serviceは、tmuxサーバーをsystemdサービスとして開始することです[0]。この方法では、SSH tmuxtmuxコマンドによって生成されるのではなく、サーバーにSSHで接続するときにサーバーが既に実行されているため、強制終了されません。

[0] https://wiki.archlinux.org/index.php/tmux#Autostart_with_systemd


これは、ルートを取得していないときに機能しますか?
gerrit

ええ、それは有効な解決策です。ただし、SSHセッションを介してSSHサービスを再起動するというケースを解決する必要があります。:)
パベルシメルダ

皆さん、OpenRCを使用する場合に備えて、ArchWiki
Megver83

1

私が見つけた最良の答えであるIMOは、tmuxセッションからのログオフの防止で提供されています。

この「機能」はsystemd以前から存在していましたがsystemd開発者は、セッションのログアウト時に子プロセスを終了する設定を有効にするために、デフォルトの変更を行うことにしました

logind.conf/etc/systemd/logind.conf)でこの設定を元に戻すことができます:

KillUserProcesses=no
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.