ログアウト後にLinuxプロセスを実行し続ける


142

SSH経由でLinuxマシンに接続し、ファイルシステム操作を行う重いbashスクリプトを実行しようとしています。何時間も実行し続けることが期待されていますが、インターネット接続の問題があるため、SSHセッションを開いたままにすることはできません。

バックグラウンド演算子であるアンパサンド(&)を使用してスクリプトを実行するとうまくいかないのではないかと考えています。ログアウトしてプロセスを実行し続けるにはどうすればよいですか?

回答:


135

最適な方法は、ターミナルマルチプレクサでプロセスを開始することです。または、プロセスがHUPシグナルを受信しないようにすることもできます。


ターミナルマルチプレクサは「本物」の端末(実際にはすべての端末今日は「仮想」ですが、それは別の日の別のトピックである)から独立して実行する「仮想」の端子が用意されています。実際の端末がsshセッションで閉じられていても、仮想端末は実行を続けます。

仮想端末から開始されたすべてのプロセスは、その仮想端末で実行され続けます。サーバーに再接続すると、仮想端末に再接続でき、経過した時間以外は何も起こらなかったようになります。

2つの一般的な端末マルチプレクサはscreentmuxです。

画面には急な学習曲線があります。以下に、概念を説明する図を含む優れたチュートリアルを示します。http//www.ibm.com/developerworks/aix/library/au-gnu_screen/


HUPの端子が閉じているときに信号(またはSIGHUP)は、そのすべての子プロセスに端末によって送信されます。SIGHUPを受け取ったときの一般的なアクションは、終了することです。したがって、sshセッションが切断されると、すべてのプロセスが終了します。これを回避するには、プロセスがSIGHUPを受け取らないようにします。

そうするための2つの簡単な方法があるnohupdisown

方法nohupdisown動作の詳細については、この質問と回答をお読みくださいhttps : //unix.stackexchange.com/questions/3886/difference-between-nohup-disown-and

注:プロセスは引き続き実行されますが、端末に接続されなくなったため、プロセスと対話できなくなります。このメソッドは主に、一度実行されるとユーザー入力を必要としない長時間実行されるバッチプロセスに役立ちます。


3
インタラクティブな状況と非インタラクティブな状況の両方にソリューションを提供するため、この回答が気に入っています。対話型の場合、screenより多くのオプションが提供されますが、を使用authorized_keysしてユーザーがスクリプトをリモートで実行できるようsshにするnohup場合、このオプションは、スクリプトが開始にssh使用されたセッションよりも長く続くプロセスを開始するための素晴らしい簡単な方法です。
マークブース

1
@rahmanisback-受け入れられた回答はいつでも変更できます。これまでのところEricAの答えが最も高く投票されるからといって、それがあなたにとって最良の答えであることを意味するわけではありません。
マークブース

3
*咳* tmuxisbetter *咳*
ひどい

3
tmux >画面。それを試して、あなたは二度と戻らないでしょう。
h0tw1r3

1
@TheLQ-byobu GNUスクリーンです。高度にカスタマイズされた.screenrcを使用して、まだスクリーンを使用しています。
EEAA

92

これを行うにはいくつかの方法がありますが、私が最も役立つと思うのはGNU Screenを使用することです。

sshを実行したら、実行しscreenます。これにより、画面内で実行されている別のシェルが起動します。コマンドを実行してからCtrl-を実行しますa d

これにより、スクリーンセッションから「切断」されます。この時点で、ログアウトするか、必要な操作を実行できます。

スクリーンセッションに再接続する場合はscreen -RD、シェルプロンプトから実行するだけです(セッションを作成したユーザーと同じユーザーとして)。


6
画面には、Ctrl-aで始まるすべてのコマンドがあります。1つだけ余分に学習する場合は、「Ctrl-a?」から始めます。その後、「Ctrl-a c」と「Ctrl-a n」を学習する必要はありません
olafure

@olafure +1、ありがとう。Screenは私の主要なツールボックスになりそうです。
-doc_id

tmux >画面。それを試して、あなたは二度と戻らないでしょう。
h0tw1r3

tmuxの場合は+1。5週間前に画面を放棄しました。
ブライアンハント

73

ではbashdisownキーワードはこれに最適です。最初に、プロセスをバックグラウンドで実行します(を使用するか&、または^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後でタスクをバックグラウンドおよびデタッチすることを決定する場合にのみ使用できます。


1
それは非常に良い答えです、1 +。nohupまたはScreenの唯一の設定はbashの独立性であり、他のシェルで使用される場合があります。しかし、bashを使用しているときはいつでもあなたのアプローチに固執します。
doc_id

はい-これはbash固有のものです。bashはこれまで使用した唯一のシェルです。他のシェルが同様の何かをサポートしているかどうか(つまり、nohupなしでバックグラウンドで起動するかどうか)-他のシェルに他の回答を投稿できるとすばらしいでしょう。
ジェレミーフィッサー

1
sh-lookalikeでそれを行う方法を示す私の答えを参照してください
w00t

1
後で決定できるため+1。この瞬間、私はこれを必要としていました。宣伝として働いていた
code_monk

37

ほとんどのLinuxボックスで利用可能なnohupツールがこれを行います。


1
これが最も簡単な答えです。からの出力はすべて自動的にnohup.outに送られ、後で調べることができます。
ジュリアン

3
nohupはzshをまったく必要としません。
アーロンブラウン

nohupは正解です。ハングアップがないことを意味します。
Kinjalディキシット

2
nohupはスクリーンよりもはるかに多くのマシンで検出されるため、使用方法を知っておく必要があります。
ゼノン

27

念のため、画面と同じ基本概念を持つtmuxを指摘します。

tmuxは、GNU screenなどのプログラムに代わる、BSDライセンスの最新のものとなることを目的としています。主な機能は次のとおりです。

  • 強力で一貫性のある、十分に文書化された、簡単にスクリプト化可能なコマンドインターフェイス。
  • ウィンドウは、水平方向と垂直方向にペインに分割できます。
  • ペインは、自由に移動およびサイズ変更したり、プリセットレイアウトに配置したりできます。
  • UTF-8および256色端末のサポート。
  • 複数のバッファを使用してコピーして貼り付けます。
  • ウィンドウ、セッション、またはクライアントを選択するための対話型メニュー。
  • ターゲット内のテキストを検索して、現在のウィンドウを変更します。
  • 手動またはタイムアウト後の端末ロック。
  • クリーンで拡張が容易なBSDライセンスのコードベースで、活発に開発中です。

ただし、Googleでの検索はほぼ無限に簡単です。


2
"gnu screen"検索クエリとしての使用は非常にうまく機能します。
ヌール

4
tmuxで+1000!
mbq

11

画面は、ログアウト時にプロセスを実行し続けるだけでは過剰です。

dtachを試してください:

dtachはCで書かれたプログラムで、画面のデタッチ機能をエミュレートします。これにより、制御端末から保護されている環境でプログラムを実行できます。たとえば、dtachの制御下にあるプログラムは、何らかの理由で端末が切断されても影響を受けません。

dtachは、スクリーンが私のニーズを十分に満たしていないために書かれました。複数の端末のサポートや端末エミュレーションのサポートなど、画面の追加機能は必要ありませんでした。画面も大きすぎてかさばり、理解しにくいソースコードがありました。

screenは、プログラムと接続された端末間のストリームを過度に解釈するため、emacsやircIIなどのフルスクリーンアプリケーションの使用を妨げました。dtachには端末エミュレーションレイヤーがなく、プログラムの生の出力ストリームを接続された端末に渡します。dtachが実行する唯一の入力処理は、デタッチ文字(プログラムからデタッチするようdtachに信号を送る)のスキャンとサスペンドキーの処理(実行中のプログラムに影響を与えずにdtachに一時停止するよう指示する)です。必要に応じて無効にします。

画面とは異なり、dtachの機能は最小限であり、非常に小さいです。これにより、dtachのバグやセキュリティホールの監査がより簡単になり、レスキューディスクなどのスペースが限られている環境でアクセスできるようになります。


ありがとうございました。dtachについても投稿するためだけにここに来ました。これは、現在のターミナルデタッチメントにとって重要なことです。画面はあまりにも多くのことを行い、ばかげた程度の入力を妨げます。ファクトスクリーンに独自のtermcapが必要なため、かなり不安です。
ふわふわ

9

シェルプロセスをデーモン化する方法を次に示します。外部プログラムは不要です。

( while sleep 5; do date; done ) <&- >output.txt &

その後、セッションを閉じると、output.txtファイル(バッファリングがあるため、ゼロ以外の表示に時間がかかる)で示されるように、ジョブは引き続き実行されます。テスト後に仕事を殺すことを忘れないでください。

したがって、必要なのは標準入力を閉じてジョブをバックグラウンドにすることだけです。本当に良いことをするためには、まずcd /マウントを握らないようにします。

これは、Solarisの単純なshでも機能します。


面白い。いくつかの注目すべき質問が浮上しました。STDINを何も設定していないことがわかります、-オペレーターですか?違いは何である< /dev/nullとは&-?STDIN(および他のSTDOUTとSTDERR)は、によってファイルに割り当てられるか、STDINの場合には< fileストリームに割り当てられると思い<& streamます。< /dev/null上記の例で使用した場合と同じでしょうか?そして、-上記の演算子はストリームとしてnullを参照していますか?
-doc_id

x <&-を実行すると、ファイル記述子xが閉じます。この場合、xはありません。これにより、bashがデフォルトの1、つまり標準入力になります。</ dev / nullを使用している場合、stdinを閉じているのではなく、入力としてプログラムに空のファイルを渡しているだけです。
-w00t

1
そして正直に言うと、これがなぜあなたが実行しているものをデーモン化するのか本当に分かりません:-)それは動作しますが、私たちはそれを本番環境で使用しています。私は、特別なものを必要とせずにシェルでプロセスをデーモン化できることを望んでいましたが、それを発見しました-それで、stdinを閉じることから始めました、それで十分でした。いくつかのシェルソースを読む必要がありますが、stdinを閉じてプロセスをバックグラウンドにすると、プロセスも切り離されると思います。
-w00t

2
理由は、親プロセスがその子のstdinハンドルを閉じると、SIGHUP(シェルが終了したときに子を終了させる実際のシグナル)がトリガーされるためだと思います。ただし、stdin 事実として閉じられるのではなく、nullで始まる場合、親がSIGHUPをトリガーする方法はありません。しかし、素敵な発見-それを考えたことがなかったでしょう。
ジェレミーフィッサー

@JeremyVisserそれは本当にもっともらしいですね!
w00t

7

atコマンドは、このような状況のために有用であることができます。たとえば、次を入力します。

at now

そして、実行するコマンドまたは一連のコマンドを入力できます。マシンで電子メールが正しく設定されている場合、結果を電子メールで送信する必要があります。

の代わりにnow、オプションで日付またはのような時間式で時間を指定できますnow + 15 minutes。詳細man atを参照してください。


7

byobuUbuntuの場合は、画面のフロントエンドとして最適です。押すとCtrl- ?あなたはすべてのキーボードショートカットのリストを取得します。CPU負荷、ディスク容量などを監視するのに役立つステータスバーを追加します。全体として、ターミナルベースのVNC接続として説明するエクスペリエンスを提供します。

nohup 出力をログファイルにルーティングして、バックグラウンドでジョブを開始できます。ログファイルは、不要な場合は常に/ dev / nullにリダイレクトできます。

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