Linux。コマンドを実行したいが、時間がかかりすぎるとしましょう。それが確実に行われるようにしたいだけです。どうやって?
Nohup
Nohup
の使用法については、manページを参照してください。
Nohup
は、screen
、tmux
などが発明される前からずっと続いている方法です。
例:
Nohup my_long_running_proc &
"my_long_running_proc"を実行し、コンソール(stdout/stderr)メッセージは、コマンドが開始されたディレクトリの "Nohup.out"というファイルに送られます。
tmux
またはscreen
を使用して、コマンドを実行するための永続的なセッション環境を提供します。
tmux
を使用すると、これは次の方法で実現できます。
tmux new -s my-session-name
longrunningcommand
Ctrl+b
を使用してtmux
から手動でデタッチし、次にd
tmux attach-session -t my-session-name
tmux
はそれ以上のことを実行できますが、おそらく追加する必要がある1つの基本的なこと:tmux list-sessions
を使用してすべてのアクティブなセッションを表示します。
コマンドxclockでテストします。コンソールを開き、次のように入力します
xclock
コンソールを閉じます。 xclockが消えます。今タイプしてください
xclock &
それでもシェルのサブプロセスであるため、xclockは依然として消えます。今タイプしてください
xclock & disown
これでxclockはシェルのサブプロセスではなくなり、コンソールを閉じるとxclockは実行を続けます。
私はこれをここに文書化しました: http://www.linuxintro.org/wiki/Disown
シェルからログアウトすると、実行中のすべてのchldrenにSIGHUPシグナルが送信されます。ログアウト後もプロセスを継続して実行するには、デフォルトの動作が終了するため、このシグナルをトラップ、無視、または回避する必要があります。
Nohup
コマンドはシグナルを無視し、プロセスがstdout
に重要なものを送信しない場合にそれを行う一般的な方法です。
screen
コマンド(これは私の好みです)は、切り離して再接続できるシェル内シェルを作成します。これにより、シグナルがまったく生成されないようにします(または、親から切り離して、信号を取得することはありません)。
プロセスが自分で作成した場合は、シグナルをキャッチするようにコード化してから、無視するなどのアクションを実行して、ログアウト後も引き続き実行できるようにすることができます。プロセスは、親プロセス(setsid()
を参照)との関連付けを完全に解除して、screen
と同様に、ログアウト中にSIGHUPを受信しないようにすることもできます。
どちらの方法を選択するかはあなた次第であり、どちらの方法が状況と使用に適しています。
Bash 3.2では、disown -h
が最適です。たとえば、ターミナルが閉じるときにgedit
が閉じないようにするには、bothをバックグラウンドに配置してdisown
を使用する必要があります。 〜/ .bashrcの関数でこれを行うのは簡単です:
ge() { gedit "$@" & disown -h; } # need double--not single--quotes
私はtmux
とscreen
をうまく置き換える非常に小さいが効率的なツールはdtach
です。このツールは、これらの複雑なウィンドウ管理機能をすべて取り除きますが、ジョブをバックといつでも好きなときに手前に持ってきてください。
tmuxを使用:
Sudo apt-get install tmux
開始するには、単にtmux
と入力し、最小化するには、 Ctrl+b その後 d 同じセッションタイプを開始するにはtmux attach
。
コマンドのstdout
およびstderr
をファイルにリダイレクトし、その終了値を保存してから、Nohup
または(より良い)tmux
のようなターミナルマルチプレクサーで実行します。またはscreen
:
command 1> command.out 2> command.err; echo $? > command.exit
進捗状況を確認するには、単にtail -f
ログファイル。ファイルにログインするポイントは、ターミナルマルチプレクサーのバッファーが制限されており(通常、ほとんどのタスクに十分な大きさに設定できます)、それらはmightクラッシュします。この場合、すべての出力が失われます。