回答:
あなたのタスクがすでに起動された場合、手遅れになる*
代替ソリューションを検討しているあなたとの間に追加の層を挿入しssh
たセッションとシェルがコマンドを実行している、のようなscreen
、tmux
、byobu
、nohup
と同類。
あなたのプロセスのサポートは、バックグラウンドに配置する場合は、特にときハングしないstdout
とstderr
書き込みできない/が閉鎖され、あなたがログアウトする前に、バックグラウンドでそれを置くことができますControlZし、bg
その後で自分の殻から取り外しdisown
組み込み。
例えば:
$ ssh localhost
You have new mail.
Last login: Fri Jun 6 11:26:56 2014
$ /bin/sleep 3600
^Z[1] + Stopped /bin/sleep 3600
$ bg
[1] /bin/sleep 3600&
$ jobs
[1] + Running /bin/sleep 3600
$ disown %1
$ exit
Connection to localhost closed.
$ ps -ef|grep sleep
jlliagre 12864 1 0 21:12 ? 00:00:00 /bin/sleep 3600
jlliagre 13056 12477 0 21:13 pts/18 00:00:00 grep sleep
$
*
Bobがコメントしたように、実際にはLinuxでttyセッションの親を変更するハック的な方法がいくつかあります。repty、retty、injcode、およびneercs。最も高度なものはreptyrに見えますが、ptraceがプロセスをハックできるようにするにはroot権限が必要になる場合があります。
disown
コマンド
bg
返信の最初の部分でコマンドが必要かどうかは不明でした。編集済み。
kill -CONT
ほぼ同じプロセスを再び実行できるようになります。
1つの解決策は、GNU screenを使用することです。起動しscreen
てコマンドを実行し、でデタッチできますC-a d
。後で、再接続するにはを実行screen -r
し、前のセッションに戻ります。
画面のその他の利点はウィンドウ管理です(したがって、コマンドの実行中に新しいSSH接続を必要とせずに他のシェルに切り替えることができます)。また、現在のセッションであろうと後のセッションであろうと、コマンドをフォアグラウンドにとどめることができます。
編集:コメントに記載されているように、これはscreen
コマンドを実行する前に起動することを忘れない場合にのみ機能します。コマンドが既に実行されている場合は、@ jlliagreのソリューションが必要になります。
tmux
このような別のプログラムscreen
は、現在のSSH接続に関連付けられていないリモートセッションを持つことを可能にします。
screen
。
screen
やなどに接続する方法はありませんtmux
。)
そのための「標準的な」方法の1つは、次のようにnohup
に含まれるコマンドを使用するcoreutils
ことです。
nohup COMMAND [ARGS] &
しかし、このコマンドはプログラムの出力(STDOUT
&STDERR
AFAIK)をファイルnohup.out
にリダイレクトしますが、それはなんらかの面倒なこと(巨大なログファイルの生成など)になるため、独自のリダイレクトを行うか、/ dev / nullにリダイレクトすることをお勧めしますお望みならば。
nohup
にこれに使用できます。実行中のプロセスを一時停止し、バックグラウンドに送信するだけで(Ctrl
+ Z
および実行bg
)、発行できますnohup %1
。
さらに、nohup
「&」とサブシェルを使用してバックグラウンドでプロセスを起動できます。
コマンドの末尾に&を付け、括弧で囲みます
$ (thecommand args &)
プロセスがpid 1922を獲得したとしましょう:
$ ps -f
UID PID PPID C STIME TTY TIME CMD
usr 11473 2643 0 15:07 pts/1 00:00:00 bash
usr 11922 1 0 15:11 pts/1 00:00:00 thecommand
元の親であるシェルプロセス11473からアタッチされていないことを確認します。したがって、現在のシェル(11473)を終了または強制終了すると、プロセス11922は実行を続け、ptsから切断されます。
シェルを終了し、新しいシェルを入力してください。このシェルが同じPTSに接続されている場合でも、PTSなしでプロセスを確認できます。
$ ps -fp 11922
UID PID PPID C STIME TTY TIME CMD
usr 11922 1 0 15:11 ? 00:00:00 thecommand
Posixでの呼び出し方法や文書化方法はわかりませんが、1990年からbsh、ksh、そしてbashでこの方法を使用しています。
最後に、bg
組み込みシェルコマンドを使用できます。
プログラムを起動し、一時停止することを決定した場合、またはプログラムをバックグラウンドで維持することを計画している場合は、CTRL + Zを入力します。
$ thecommand
^Z
[1] Stopped thecommand
次に、バックグラウンドで実行し続けます。
$ bg
[1]+ thecommand &
プロセス情報を見ると、まだ親プロセスがあります:
$ ps -f
UID PID PPID C STIME TTY TIME CMD
usr 12046 2643 0 15:18 pts/6 00:00:00 bash
usr 12571 12046 0 16:00 pts/6 00:00:00 thecommand
usr 12601 12046 0 16:04 pts/6 00:00:00 ps -f
したがって、現在のプロセスを終了します。バックグラウンドで実行中のプロセスは元の親から切り離され、バックグラウンドで実行され続けます。
$ exit
再度ログインして、プロセス情報を確認します。
$ ps -f 12571
UID PID PPID C STIME TTY TIME CMD
usr 12571 1 0 16:00 ? 00:00:00 thecommand
disown
コマンドを実行しました。bash:警告:プロセスグループ24876で停止したジョブ1を削除します。現在、私のジョブはリストされてps -all
いますが、動作していないようです(CPU使用率は0%)