回答:
最適な方法は、ターミナルマルチプレクサでプロセスを開始することです。または、プロセスが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-and
注:プロセスは引き続き実行されますが、端末に接続されなくなったため、プロセスと対話できなくなります。このメソッドは主に、一度実行されるとユーザー入力を必要としない長時間実行されるバッチプロセスに役立ちます。
これを行うにはいくつかの方法がありますが、私が最も役立つと思うのはGNU Screenを使用することです。
sshを実行したら、実行しscreen
ます。これにより、画面内で実行されている別のシェルが起動します。コマンドを実行してからCtrl-を実行しますa d。
これにより、スクリーンセッションから「切断」されます。この時点で、ログアウトするか、必要な操作を実行できます。
スクリーンセッションに再接続する場合は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を指摘します。
tmuxは、GNU screenなどのプログラムに代わる、BSDライセンスの最新のものとなることを目的としています。主な機能は次のとおりです。
- 強力で一貫性のある、十分に文書化された、簡単にスクリプト化可能なコマンドインターフェイス。
- ウィンドウは、水平方向と垂直方向にペインに分割できます。
- ペインは、自由に移動およびサイズ変更したり、プリセットレイアウトに配置したりできます。
- UTF-8および256色端末のサポート。
- 複数のバッファを使用してコピーして貼り付けます。
- ウィンドウ、セッション、またはクライアントを選択するための対話型メニュー。
- ターゲット内のテキストを検索して、現在のウィンドウを変更します。
- 手動またはタイムアウト後の端末ロック。
- クリーンで拡張が容易なBSDライセンスのコードベースで、活発に開発中です。
ただし、Googleでの検索はほぼ無限に簡単です。
"gnu screen"
検索クエリとしての使用は非常にうまく機能します。
画面は、ログアウト時にプロセスを実行し続けるだけでは過剰です。
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でも機能します。
-
オペレーターですか?違いは何である< /dev/null
とは&-
?STDIN(および他のSTDOUTとSTDERR)は、によってファイルに割り当てられるか、STDINの場合には< file
ストリームに割り当てられると思い<& stream
ます。< /dev/null
上記の例で使用した場合と同じでしょうか?そして、-
上記の演算子はストリームとしてnullを参照していますか?
screen
より多くのオプションが提供されますが、を使用authorized_keys
してユーザーがスクリプトをリモートで実行できるようssh
にするnohup
場合、このオプションは、スクリプトが開始にssh
使用されたセッションよりも長く続くプロセスを開始するための素晴らしい簡単な方法です。