ssh接続linuxサーバが中断した後、コマンドをサーバで実行し続ける方法

5896 ワード

ssh接続linuxサーバが中断した後、コマンドをサーバで実行し続ける方法
この問題は私たちシロが頭が痛い問題かもしれませんが、特に機械の勉強には長い時間がかかります.しかし、この時、様々な不可抗力のためにsshを使用してサーバに接続すると、sshのウィンドウが突然接続を切断し、サーバ上を走るプログラムも切断され、前に走ったデータも失われ、多くの時間を浪費します.
今日ちょうどある人は私にこの問題に言及して、それから簡単にインターネットを利用して資料を探して、簡単に勉強して、ノートを作って自分で後で調べるのが便利です.
参照リンク:
http://blog.csdn.net/gukesdo/article/details/6901902
なぜsshが私たちのプロセスを断ち切ったら殺されるの?
元凶:SIGHUP信号
ウィンドウを閉じる/接続を切ると、実行中のプログラムが死んでしまう理由を見てみましょう.
Linux/Unixでは、次のような概念があります.
プロセスグループ(process group):1つ以上のプロセスの集合であり、各プロセスグループには唯一のプロセスグループID、すなわちプロセスグループ長プロセスのIDがある.
セッション期間(session):1つ以上のプロセスグループの集合で、唯一のセッション期間ヘッダがあります.セッション期間IDが先頭プロセスのIDです.
セッション期間は、個別の制御端末(controlling terminal)を有することができる.制御端末に接続されるセッション期間の最初のプロセスを制御プロセス(controlling process)と呼ぶ.現在端末と対話しているプロセスをフロントプロセスグループと呼ぶ.残りのプロセスグループをバックグラウンドプロセスグループと呼びます.
POSIXによる.1定義:
ストップ信号(SIGHUP)のデフォルトの動作はプログラムを終了します.
端末インタフェースがネットワーク接続の切断を検出すると、制御プロセス(セッション期間の最初のプロセス)に切断信号が送信される.
セッション期間の最初のプロセスが終了した場合、この信号はセッション期間のフロントプロセスグループに送信されます.
プロセス終了によって孤児プロセスグループが生成された場合、いずれかの孤児プロセスグループプロセスがSTOP状態にある場合、プロセスグループ内のすべてのプロセスにSIGHUP信号とSIGCONT信号が送信されます.
したがって、ネットワークが切断されたり、端末ウィンドウが閉じられたりすると、制御プロセスはSIGHUP信号を受信して終了し、セッション期間内に他のプロセスが終了する.
ここで私たちのプロセスが殺されたのはsshとサーバ間の通信が切れたためだと思います.この通信が切れた後、linuxプログラムはデフォルトで接続下のすべてのプロセスを殺します.
ソリューション
上記の質問に対して、上の参考リンクでも説明があり、ここで簡単な整理を行います.
ここでは主に3つのスキームがあり、1つはnohup命令を使用し、1つはscreen命令を使用し、最後の1つはscreenのアップグレード版byobuである.この3つのコマンドを見た後、実は**私はbyobuコマンドを使う傾向があります.byobuコマンドはもっと強く、screenのアップグレードバージョンであり、インタフェースも友好的です.**
Nohupコマンド
Nohupコマンドリファレンス
Nohupコマンド
用途:コマンドを中断せずに実行します.
構文:nohup Command[Arg...][&]
説明:nohupコマンドは、Commandパラメータと関連するArgパラメータによって指定されたコマンドを実行し、すべての切断(SIGHUP)信号を無視します.ログアウト後にnohupコマンドを使用してバックグラウンドのプログラムを実行します.バックグラウンドのnohupコマンドを実行するには、コマンドの末尾に&(andを表す記号)を追加します.
Nohupコマンドの出力を端末にリダイレクトかどうかにかかわらず、出力は現在のディレクトリのnohupに付加される.outファイルにあります.現在のディレクトリのnohup.outファイルは書き込み不可で、出力は$HOME/nohupにリダイレクトします.outファイルにあります.追加用にファイルを作成または開くことができない場合は、Commandパラメータで指定したコマンドは呼び出せません.標準エラーが端末である場合、指定したコマンドが標準エラーに書かれたすべての出力を標準出力として同じファイル記述子にリダイレクトします.
Nohupの簡単な使用
コマンドを実行するときにコマンドの前にnohupを付け、車に戻って運転を開始します.
このとき、あるべき出力が実際に出力されていないことに気づきます.このときは、nohupコマンドが現在のフォルダの下のnohupにすべての出力を出力しているからです.outファイルではvimコマンドを使用して表示できます.
Nohupコマンドとその出力ファイルnohupコマンド:プロセスを実行しており、アカウントを終了してもプロセスが終了しないと思う場合は、nohupコマンドを使用します.このコマンドは、アカウントを終了/終了した後、対応するプロセスを実行し続けることができます.Nohupは掛けないという意味です(n ohang up).このコマンドの一般的な形式は、nohup command&nohupコマンドを使用してジョブをコミットnohupコマンドを使用してジョブをコミットと、デフォルトではジョブのすべての出力がnohupという名前にリダイレクトされる.outのファイルには、出力ファイル:nohup command>myoutが別途指定されていない限り.file 2>&1 &
ジョブを使用してタスクを表示します.
fg%nを使用して閉じます.
screenコマンド
簡単に言えば、Screenは、複数のプロセス間で1つの物理端末を多重化できるウィンドウマネージャです.Screenにはセッションの概念があり、ユーザーは1つのscreenセッションで複数のscreenウィンドウを作成することができ、各screenウィンドウで実際のtelnet/SH接続ウィンドウを操作するようにすることができます.screenで新しいウィンドウを作成するには、次の方法があります.
1.コマンドラインに直接screenコマンドを入力
$screen Screenはshellを実行するフルスクリーンウィンドウを作成します.sshウィンドウのように任意のshellプログラムを実行できます.ウィンドウにexitを入力してウィンドウを終了します.これがscreenセッションの唯一のウィンドウである場合、screenセッションが終了します.そうしないと、screenは自動的に前のウィンドウに切り替わります.
2.Screenコマンドの後に実行するプログラム.
$screen【後でプログラムのコマンドを実行します】
Screenはvi testを実行する.cの単一ウィンドウセッションはviを終了するとそのウィンドウ/セッションを終了する.
3.上記の2つの方法で、新しいscreenセッションを作成します.既存のscreenセッションで新しいウィンドウを作成することもできます.現在のscreenウィンドウにC-a c、すなわちCtrlキー+aキーを入力し、cキーを押すと、screenはセッション内で新しいウィンドウを生成し、ウィンドウに切り替えます.
screenにはさらに高度な機能があります.screenウィンドウ内のプログラムの実行を中断することなく、screenセッションを一時的に切断し、その後の時間にセッションを再接続し、各ウィンドウで実行されるプログラムを再制御することができます.
screenの簡単な使用
実行する命令の前にscreenを追加する.そしてプログラムの実行などはすべて正常です.(nohupの出力はnohup.outファイルに指向しているが、screen命令の出力は画面に直接出力されている)
このときssh端末が切断された場合.サーバに再接続して命令を入力するだけです
screen -ls

次のような結果が得られます.
There is a screen on:
	27267.pts-19.TITAN-X	(09/08/2017 03:49:10 PM)	(Detached)
1 Socket in /var/run/screen/S-huanghailiang.

ここにsshが切断される前のプログラムが表示されますが、実は切断された後もプログラムはバックグラウンドで実行されています.ただ、私たちはこの時にフロントに置いて実行する必要があります.この時、私たちはscreen-lsを通じてスレッド番号が27267であることを検索したので、次の命令を実行するだけでフロントに復元することができます.
screen -r 27267

端末を殺そうとすれば実行できる
kill 27267

他のより多くの命令はscreen--helpで学習することができます.
もちろんscreenにはもっと多くのショートカットキーがあります.私たちが学ぶ価値があります.C-aを通ってもいいですか?つまりctrl+aを押してから押しますか?で行ないます.
観察により,sshが切断される前の界面を回復していることが分かった.(すべての出力もここに表示されます)
byobuコマンド
byobuはscreenのアップグレードバージョンで、インタフェースが友好的で、操作も便利だと感じています.一般的にUbuntuシステムの開始時にはデフォルトでインストールされていません.byobuuを手動でインストールする必要があります.
sudo apt install byobu

byobuの基本的な簡単な操作
キーを押す
説明
F2
新規ウィンドウ
F3
前のウィンドウに移動
F4
次のウィンドウに移動
F6
byobuウィンドウを終了
F9
byobuメニューを開き、ヘルプ情報の構成情報を表示します.
現在のウィンドウを閉じるには、Ctrl+Dで完了します.
残りの操作はF 9でbyobuのヘルプを見ることができます.
ログインしてbyobuインタフェースを表示したい場合は、コマンドを使用できます
byobu-enable

ログインをキャンセルしたい場合はbyobuインタフェースを表示し、コマンドを使用することができます.
byobu-disable

注(個人の理解):
Nohupはすべての出力をnohupに書き込むことができるが.outの真ん中に来ますが、ヒューマンマシンのインタラクションが必要なときに正常に使用できません.また、私がテストをしていたとき、sshが切れると、プログラムはバックグラウンドで実行されていましたが、nohupに出力が書き込まれないようです.outファイルでは、この点はよくありません.
screenはそれに比べてずっと強く、ヒューマンマシンのインタラクションを満たすだけでなく、すべての出力を再表示することができ、私たちが表示するのに便利です.私のscreenに対する理解は、実はそれは仮想的な端末で、私たちが実行している間にscreenコマンドは私たちのために仮想的な端末を作成したので、私たちが再び接続した後に開いたのはやはりこの仮想的な端末なので、私たちはもっとよく操作することができて、screenは多くの端末を開くことをサポートしています.
byobuはscreenのすべての利点を継承し、より便利で速い操作インタフェースを持ち、インタフェースの下に現在のコンピュータのハードウェアの使用状況をよく表示することができ、非常に便利です.
これら3つの共通性はSIGHUP信号の影響を受けていないと思いますので、sshプログラムを切断しても動作します.