私はSSHを介してLinuxマシンに接続しており、ファイルシステム操作を行う重いbashスクリプトを実行しようとしています。何時間も実行し続けると予想されますが、インターネット接続の問題があるため、SSHセッションを開いたままにできません。
スクリプトをバックグラウンドオペレーターのアンパサンド(&
)、私はそれを試し、後でプロセスが完了していないことがわかったので、トリックを行います。ログアウトしてプロセスを実行し続けるにはどうすればよいですか?
最良の方法は、ターミナルマルチプレクサでプロセスを開始することです。または、プロセスがHUPシグナルを受信しないようにすることもできます。
ターミナルマルチプレクサ は、「実際の」ターミナルから独立して実行される「仮想」ターミナルを提供します(実際には、今日のすべてのターミナルは「仮想」ですが、これは別の日の別のトピックです)。 sshセッションで実際の端末が閉じられても、仮想端末は実行を続けます。
仮想端末から開始されたすべてのプロセスは、その仮想端末で引き続き実行されます。サーバーに再接続すると、仮想端末に再接続でき、経過した時間以外は何も起こらなかったかのようになります。
2つの一般的なターミナルマルチプレクサは screen および tmux です。
画面の学習曲線は急です。これは、概念を説明する図付きの優れたチュートリアルです。 http://www.ibm.com/developerworks/aix/library/au-gnu_screen/
[〜#〜] hup [〜#〜] 信号(またはSIGHUP)は、端末が閉じているときに端末からすべての子プロセスに送信されます。 SIGHUPを受け取ったときの一般的なアクションは、終了することです。したがって、sshセッションが切断されると、すべてのプロセスが終了します。これを回避するには、プロセスでSIGHUPを受信しないようにします。
そうするための2つの簡単な方法は Nohup
と disown
です。
Nohup
とdisown
の動作の詳細については、次の質問と回答をご覧ください。 https://unix.stackexchange.com/questions/3886/difference-between-Nohup-disown -および
注:プロセスは引き続き実行されますが、どの端末にも接続されていないため、プロセスを操作することはできません。この方法は主に、一度開始するとユーザー入力を必要としない、長時間実行されるバッチプロセスに役立ちます。
これを行うにはいくつかの方法がありますが、私が最も役立つと思うのは GNU Screen を使用することです。
Sshを実行した後、screen
を実行します。これにより、画面内で実行されている別のシェルが起動します。コマンドを実行してから、 Ctrl-ad。
これにより、スクリーンセッションから「切断」されます。この時点で、ログアウトするか、他に必要な操作を行うことができます。
スクリーンセッションに再接続する場合は、screen -RD
シェルプロンプトから(セッションを作成したのと同じ使用ユーザーとして)。
bash
では、disown
キーワードがこれに完全に適しています。まず、バックグラウンドでプロセスを実行します(&
または^Z
を使用してから、bg
と入力します):
$ wget --quiet http://server/some_big_file.Zip &
[1] 1156
jobs
と入力すると、プロセスがまだシェルによって所有されていることがわかります。
$ jobs
[1]+ Running wget
この時点でログアウトすると、バックグラウンドタスクも強制終了されます。ただし、disown
を実行すると、bashはジョブを切り離し、実行を継続できるようにします。
$ disown
これを確認できます:
$ jobs
$ logout
次のように、&
とdisown
を同じ行に組み合わせることもできます。
$ wget --quiet http://server/some_big_file.Zip & disown
$ logout
私の意見では、これはNohup
を実行するよりも優れています。ファイルシステム全体にNohup.out
ファイルが散らばっていないためです。また、コマンドを実行する前にNohup
を実行する必要があります— disown
は、バックグラウンドでタスクを切り離すことを後で決定する場合にのみ使用できます。
ほとんどのLinuxボックスで利用可能なNohupツールがこれを行います。
念のため、 tmux を指摘します。これは、screenと同じ基本的な考え方です。
tmuxは、GNU screen)などのプログラムに代わる、BSDライセンスが適用された最新のツールであることを目的としています。主な機能は次のとおりです。
- 強力で一貫性のある、十分に文書化された、スクリプト化が容易なコマンドインターフェイス。
- ウィンドウは水平および垂直にペインに分割できます。
- ペインは自由に移動してサイズを変更したり、プリセットのレイアウトに配置したりできます。
- UTF-8および256色端末のサポート。
- 複数のバッファでコピーして貼り付けます。
- ウィンドウ、セッション、またはクライアントを選択するためのインタラクティブメニュー。
- ターゲットでテキストを検索して、現在のウィンドウを変更します。
- 手動またはタイムアウト後の端末ロック。
- 活発に開発されている、クリーンで簡単に拡張できる、BSDライセンスのコードベース。
ただし、Googleで検索するのはほぼ無限に簡単です。
画面は、ログアウト時にプロセスを実行し続けるだけでは過剰です。
試してみてください dtach :
dtachはCで記述されたプログラムで、画面の切り離し機能をエミュレートします。これにより、制御端末から保護された環境でプログラムを実行できます。たとえば、dtachの制御下にあるプログラムは、何らかの理由で端末が切断されても影響を受けません。
画面が私のニーズを十分に満たしていないため、dtachが作成されました。複数の端末のサポートや端末エミュレーションのサポートなど、画面の追加機能は必要ありませんでした。画面も大きすぎてかさばり、理解しにくいソースコードがありました。
screenは、プログラムと接続された端末との間のストリームを過度に解釈するため、emacsやircIIなどのフルスクリーンアプリケーションの使用を妨害しました。 dtachには端末エミュレーション層がなく、プログラムの生の出力ストリームを接続された端末に渡します。 dtachが実行する唯一の入力処理は、切り離し文字のスキャン(プログラムから切り離すようにdtachに信号を送る)と中断キーの処理(実行中のプログラムに影響を与えずに一時的に中断するようにdtachに指示する)であり、これらは両方とも可能です。必要に応じて無効にしてください。
画面とは異なり、dtachの機能は最小限で、非常に小さいです。これにより、dtachのバグやセキュリティホールをより簡単に監査できるようになり、レスキューディスクなど、スペースが限られている環境でアクセスできるようになります。
シェルプロセスをデーモン化する方法を以下に示します。外部プログラムは必要ありません。
( while sleep 5; do date; done ) <&- >output.txt &
その後、セッションを閉じると、output.txtファイル(バッファリングがあるため、ゼロ以外の値が表示されるまでに時間がかかる)が示すように、ジョブは引き続き実行されます。テスト後は必ずジョブを終了してください。
だからあなたがする必要があるのは、標準入力を閉じて、仕事の背景を書くことだけです。本当に良くなるためには、まずcd /
したがって、マウントを保持しません。
これは、Solarisの単純なshでも機能します。
at
コマンドは、このような状況に役立ちます。たとえば、次のように入力します。
at now
そして、実行するコマンドまたは一連のコマンドを入力できます。マシンで電子メールが正しく設定されている場合は、結果が電子メールで送信されます。
now
の代わりに、オプションで日付を使用して時刻を指定するか、now + 15 minutes
のような時刻式を指定できます。詳細については、man at
をご覧ください。
Ubuntuのbyobu
は、画面への素敵なフロントエンドです。押すことにより Ctrl-? すべてのキーボードショートカットのリストが表示されます。これは、CPU負荷、ディスク容量などを監視するのに役立つステータスバーを追加します。全体的に、ターミナルベースのVNC接続として説明するようなエクスペリエンスを提供します。
Nohup
を使用すると、バックグラウンドでジョブを開始し、その出力をログファイルにルーティングできます。ログファイルは、必要がなければ常に/ dev/nullにリダイレクトできます。