^z; bg; disown
非常に重要な実行時間の長いプロセスを実行しているsshセッションを閉じるために、シーケンスを発行しました。このプロセスは、ステータス出力をstderrに書き込みます。デタッチされた後も書き込みを続けます(lsofで確認、stderr fdはr / wに対して開いています)。
プロセスが実際に否認されていることを確認する方法はありますか(シェルが1を受信した場合、SIGHUPを受信しません)?
^z; bg; disown
非常に重要な実行時間の長いプロセスを実行しているsshセッションを閉じるために、シーケンスを発行しました。このプロセスは、ステータス出力をstderrに書き込みます。デタッチされた後も書き込みを続けます(lsofで確認、stderr fdはr / wに対して開いています)。
プロセスが実際に否認されていることを確認する方法はありますか(シェルが1を受信した場合、SIGHUPを受信しません)?
回答:
Bashでは、disown
コマンド自体が発行すると、バックグラウンドのプロセス(bg
またはを介して&
)がアクティブなジョブテーブルから削除され、ログアウト時にSIGHUPを受信しないようにマークが付けられます。
のように、1つ以上のジョブを渡して、否認することもできdisown 1 3
ます。このdisown -h
フラグは、ジョブをテーブルに保持したいが、ログアウト時にSIGHUPを保持しない場合に役立ちます。
jobs
コマンドを発行すると、ジョブテーブルを表示できます。背景が成功すると、が表示され[1]+ command &
ます。ジョブの否認後は、ジョブテーブルに表示されなくなり、ログアウト時に強制終了されることもなくなります。あなたはまだを介してプロセスを表示することができps ux
、top
およびその他のプロセス視聴ユーティリティ。
ジョブが否認された後、ジョブが自然に終了するまで待つかkill
、PIDにシグナルを送信してジョブを停止できます。
Bashは終了する実行中のジョブのリストからジョブを削除するだけで、ターミナルのstdoutおよびstderrへのファイルハンドルがまだ開いているため、ターミナルデバイスが閉じられるまで(ログアウトしたとき)ジョブから出力を受信し続けます。
例:
# we start a command in the background
$ cat /dev/urandom > test &
[1] 18533
# we see our command is still running
$ jobs
[1]+ Running cat /dev/urandom > test &
# we disown the backgrounded job
$ disown 1
# notice it is no longer in the job table
$ jobs
私は通常disown
、rsync
またはcp
などの長時間実行される可能性のあるコマンドを実行し、その後、終了せずにログアウトする必要があると判断した場合にのみ使用します。コマンドを実行してログアウトすることがわかっている場合はtee
、ファイルにパイプまたはpingするか、で実行するnohup
か、実行することで出力をキャプチャscreen
できます(これにより、コマンドの所有権を再取得したり、後で終了したりできます) )。
例:
# capture stdout and stderr to separate logs
cat /dev/urandom >stdout.log 2>stderr.log
# capture stdout and stderr to the same log, and display to stdout as well
cat /dev/urandom 2>&1 | tee output.log
# run a command under nohup (doesn't require a disown or job control support)
nohup cat /dev/urandom </dev/null
detach
バックグラウンドジョブで実行すると、ジョブは切り離されます:)バックグラウンドプロセスで実行しても何も起こらない中間点はありません。チェックjobs
は、停止したプロセスなどを切り離そうとしていないことを確認するだけです。