web-dev-qa-db-ja.com

実行中のプロセスを終了せずにsshセッションを切り離す方法は?

私はsshを介してサーバーでファイルシステムのサイズ変更のテストを開始しましたが、screenセッションでそれを行うのを完全に忘れていました。現在は動作しており、私のラップトップのインターネットは非常に遅いです。 ssh接続が失われた場合に実行し続ける方法はありますか?

進捗状況も出力されますが、取得する必要はありません。

OS:RHEL7.2相当(SL7)。

これを解決策としてリンクする方が良いでしょう: https://stackoverflow.com/questions/625409/how-do-i-put-an-already-running-process-under-Nohup

提案されたものの代わりにリンクする方法がわからないので、自由に追加して重複としてマークしてください

5
xcorat

reptyrを使用します

これはまさにその場合です _man 1 reptyr_ 明示的に言及します:

reptyrは、既存の実行中のプログラムを取得して新しい端末に接続するためのユーティリティです。 sshを介して実行時間の長いプロセスを開始しましたが、終了する必要があり、中断したくないですか? screenを開始し、reptyrを使用してそれを取得し、sshセッションを終了して家に向かいます。

(マニュアルではscreenについて言及していますが、代わりにtmuxを使用できます)。

このメモをお見逃しなく:

reptyrは、リモートプログラムに接続するためのptrace(2)システムコールに依存します。 Ubuntu Maverick以降では、セキュリティ上の理由から、この機能はデフォルトで無効になっています。あなたはそれを一時的に有効にすることができます

_echo 0 > /proc/sys/kernel/yama/ptrace_scope
_

rootとして、またはファイル_/etc/sysctl.d/10-ptrace.conf_を編集して永続的に、この設定に関する詳細情報も含まれます。

ファイルは存在しないが_/etc/sysctl.d/_ディレクトリが存在する場合は、おそらく次の内容でファイルを作成するだけで十分です。

_kernel.yama.ptrace_scope = 0
_

設定は次回の再起動時に適用されます。以下のセキュリティに関する考慮事項をご覧ください。


基本的な使い方

基本的な使い方は簡単です:

_reptyr PID
_

ここで、PIDは、新しい端末に接続するプロセスのPIDです。注reptyrは、プロセスを別の端末に接続するだけです。これは、プロセスが新しいシェルの子になることを意味するものではありません。


セキュリティに関する考慮事項

_ptrace_scope_を_0_として設定することはお勧めしません。

Linuxの人気が高まるにつれ、それはマルウェアのより大きな標的になるでしょう。 Linuxプロセスインターフェイスの特に厄介な弱点の1つは、1人のユーザーが任意のプロセスのメモリと実行状態を検査できることです。たとえば、1つのアプリケーション(Pidginなど)が侵害された場合、攻撃者が他の実行中のプロセス(Firefox、SSHセッション、GPGエージェントなど)に接続して追加の資格情報を抽出し、そのスコープを拡大し続ける可能性があります。ユーザー支援のフィッシングに頼らずに攻撃する。

これは理論的な問題ではありません。 SSHセッションのハイジャック( http://www.storm.net.nz/projects/7 )と任意のコードインジェクション( http://c-skills.blogspot.com/2007/ 05/injectso.html )攻撃はすでに存在しており、ptraceが以前と同じように動作することが許可されている場合は引き続き攻撃可能です。 ptraceは非開発者や非管理者が一般的に使用するものではないため、システムビルダーはこのデバッグシステムを無効にするオプションを許可されている必要があります。

[…]

Sysctl設定(_CAP_SYS_PTRACE_でのみ書き込み可能)は次のとおりです。

_0_-従来のptrace権限:プロセスは、ダンプ可能である限り、同じuidで実行されている他のプロセスに対して_PTRACE_ATTACH_を実行できます[…]

_1_-制限付きptrace:プロセスには、_PTRACE_ATTACH_を呼び出す下位オブジェクトとの事前定義された関係が必要です。デフォルトでは、この関係は、上記の従来の基準も満たされた場合の子孫のみの関係です。 […]

_2_-管理者のみのアタッチ:_CAP_SYS_PTRACE_を持つプロセスのみが_PTRACE_ATTACH_で、または_PTRACE_TRACEME_を呼び出す子を通じてptraceを使用できます。

_3_-アタッチなし:プロセスはptraceを_PTRACE_ATTACH_とともに使用することも、_PTRACE_TRACEME_を介して使用することもできません。一度設定すると、このsysctl値は変更できません。

ソース

合理的なアプローチは、_ptrace_scope_を_2_に設定し、reptyrptraceを使用できるようにすることです。

_echo 2 | Sudo tee /proc/sys/kernel/yama/ptrace_scope
Sudo setcap CAP_SYS_PTRACE+pe /usr/bin/reptyr
_

永続的な設定を保持するファイルを忘れないでください。

機能は ファイルのiノード内 に保存されます。したがって、reptyrが更新されたときに(機能的に新しい実行可能ファイルに置き換えられて)機能が失われたとしても、驚かないでしょう。

5

使用する

Ctrl-Z

アプリケーションを一時停止してコマンドラインに戻ります。次に使用します

bg

プロセスをバックグラウンドで続行できるようにします。最後に使用します

disown

そのため、セッションを切断してターミナルを閉じたときにプロセスが閉じないようにします。

プロセスは引き続き実行されますが、ターミナルに「再接続」して、新しいセッションに再接続した場合に認識している出力を表示する方法はありません。

5
apocalysque

コマンド(bashまたはzsh、場合によっては他のシェル)のコマンドとdisownコマンドの関連付けを完全に解除できます。ただし、ttyが必要な場合、コマンドはこれについて満足できない場合があります。その場合は、reptyrの回答を参照してください。

$ ssh somecentos7system
-bash-4.2$ sleep 252727
^Z
[1]+  Stopped                 sleep 252727
-bash-4.2$ bg
[1]+ sleep 252727 &
-bash-4.2$ disown
-bash-4.2$ logout
Connection to somecentos7system closed.
$ ssh somecentos7system
-bash-4.2$ pgrep -lf 252727
20089 sleep
-bash-4.2$ 

もう1つのオプションは、画面(またはtmux)セッションを自動的に開始することです。そのように設定したため、すでに開始されているので、忘れずに開始できます。それを行う方法に関する他の投稿があります。

2
thrig
  • リモートボックスにsshでログインします。 type screen次に、必要なプロセスを開始します。
  • Ctrl-Aを押してからCtrl-Dを押します。これにより、画面セッションが切り離されますが、プロセスは実行されたままになります。これで、リモートボックスからログアウトできます。
  • 後で戻ってくる場合は、再度ログオンしてscreen -rと入力します。これにより、スクリーンセッションが再開され、プロセスの出力が表示されます。

src

0
Badr Bellaj