web-dev-qa-db-ja.com

端末が閉じている場合でも、コマンドが中断されないようにするにはどうすればよいですか?

Linux。コマンドを実行したいが、時間がかかりすぎるとしましょう。それが確実に行われるようにしたいだけです。どうやって?

19
user4951

Nohup

Nohupの使用法については、manページを参照してください。

Nohupは、screentmuxなどが発明される前からずっと続いている方法です。

例:

Nohup my_long_running_proc &

"my_long_running_proc"を実行し、コンソール(stdout/stderr)メッセージは、コマンドが開始されたディレクトリの "Nohup.out"というファイルに送られます。

29
bsd

tmuxまたはscreenを使用して、コマンドを実行するための永続的なセッション環境を提供します。

tmuxを使用すると、これは次の方法で実現できます。

  • 新しいセッション環境を開始します:tmux new -s my-session-name
  • コマンドを実行します:longrunningcommand
  • ターミナルウィンドウを閉じるか、SSHセッションを実行するか、Ctrl+bを使用してtmuxから手動でデタッチし、次にd
  • 次を使用してセッションに再接続します:tmux attach-session -t my-session-name

tmuxはそれ以上のことを実行できますが、おそらく追加する必要がある1つの基本的なこと:tmux list-sessionsを使用してすべてのアクティブなセッションを表示します。

8
Elias Probst

コマンドxclockでテストします。コンソールを開き、次のように入力します

xclock

コンソールを閉じます。 xclockが消えます。今タイプしてください

xclock &

それでもシェルのサブプロセスであるため、xclockは依然として消えます。今タイプしてください

xclock & disown

これでxclockはシェルのサブプロセスではなくなり、コンソールを閉じるとxclockは実行を続けます。

私はこれをここに文書化しました: http://www.linuxintro.org/wiki/Disown

7
Thorsten Staerk
  1. 画面を使用(man screen)
  2. コマンドの最後に「&」を追加します。これはバックグラウンドで起動され、ターミナルセッションを終了すると、完了するはずです。とにかく、いつも画面を使うことをお勧めします。

シェルからログアウトすると、実行中のすべてのchldrenにSIGHUPシグナルが送信されます。ログアウト後もプロセスを継続して実行するには、デフォルトの動作が終了するため、このシグナルをトラップ、無視、または回避する必要があります。

Nohupコマンドはシグナルを無視し、プロセスがstdoutに重要なものを送信しない場合にそれを行う一般的な方法です。

screenコマンド(これは私の好みです)は、切り離して再接続できるシェル内シェルを作成します。これにより、シグナルがまったく生成されないようにします(または、親から切り離して、信号を取得することはありません)。

プロセスが自分で作成した場合は、シグナルをキャッチするようにコード化してから、無視するなどのアクションを実行して、ログアウト後も引き続き実行できるようにすることができます。プロセスは、親プロセス(setsid()を参照)との関連付けを完全に解除して、screenと同様に、ログアウト中にSIGHUPを受信しないようにすることもできます。

どちらの方法を選択するかはあなた次第であり、どちらの方法が状況と使用に適しています。

4
Steve Shipway

Bash 3.2では、disown -hが最適です。たとえば、ターミナルが閉じるときにgeditが閉じないようにするには、bothをバックグラウンドに配置してdisownを使用する必要があります。 〜/ .bashrcの関数でこれを行うのは簡単です:

ge() { gedit "$@" & disown -h; }  # need double--not single--quotes
2
Joseph Quinsey

私はtmuxscreenをうまく置き換える非常に小さいが効率的なツールはdtachです。このツールは、これらの複雑なウィンドウ管理機能をすべて取り除きますが、ジョブをバックといつでも好きなときに手前に持ってきてください。

0

tmuxを使用:

Sudo apt-get install tmux

開始するには、単にtmuxと入力し、最小化するには、 Ctrl+b その後 d 同じセッションタイプを開始するにはtmux attach

0
Khan Shahrukh

コマンドのstdoutおよびstderrをファイルにリダイレクトし、その終了値を保存してから、Nohupまたは(より良い)tmuxのようなターミナルマルチプレクサーで実行します。またはscreen

command 1> command.out 2> command.err; echo $? > command.exit

進捗状況を確認するには、単にtail -fログファイル。ファイルにログインするポイントは、ターミナルマルチプレクサーのバッファーが制限されており(通常、ほとんどのタスクに十分な大きさに設定できます)、それらはmightクラッシュします。この場合、すべての出力が失われます。

0
peterph