Ubuntu サーバー 11.10
通常の (非ルート) ユーザーが nohup (nohup java ... &) を使用してプロセスを開始すると、ユーザーがターミナル (ssh) から切断すると、プロセスは応答を停止します。ユーザーが再度接続すると、プロセスは再び応答を開始します。たとえば、プロセスはデータベース (H2) であり、プロセスを開始したユーザーがターミナルから切断するとクエリへの応答が停止し、ユーザーが再度ログインすると再び応答を開始します。
バックグラウンドでプロセスが実行されないようにする、私が知らないバックグラウンド プロセスの権限はありますか? この動作の原因は何でしょうか?
答え1
nohup
うまくいくはずですが、正確なコマンドは何でしたか? 何か見落としているのかもしれません。これに関する Wikipedia のセクションを以下に示します。
Nohupping backgrounded jobs is typically used to avoid terminating them when logging
off from a remote SSH session. A different issue that often arises in this situation
is that ssh is refusing to log off ("hangs"), since it refuses to lose any data
from/to the background job(s). This problem can also be overcome by redirecting all
three I/O streams:
nohup ./myprogram > foo.out 2> foo.err < /dev/null &
したがって、次のようなことができます。
ssh -n -f user@remotebox "sh -c 'cd /foo/bar; nohup ./myprogram > foo.out 2> foo.err < /dev/null &'"
それでもまだうまくいかない場合は、 を試してくださいscreen
。これにより、プロセスを「バックグラウンド」で実行できるようになり、ログアウトした後も実行され続けます。
まず、ssh
リモート ボックスに移動し、そこから を使用しscreen
てプロセスを開始します。必要に応じてセッション名を付けることができます。実際には何も違いはわかりませんが、そのセッションでプロセスを開始します。その後、 コマンドを使用してセッションscreen
を終了できます。次のようになります。screen
Ctrl-a d
user@remotebox:~$ screen -S foobarsession
user@remotebox:~$ startmyprocess
[detached from 4865.foobarsession]
user@remotebox:~$
その後、ssh セッションを終了しても、プロセスは実行され続けます。screen
後でセッションに再接続するには、リモート ボックスに ssh で戻り、 を使用して再接続します。 を使用してセッションを一覧表示screen -r
できます。screen -ls
user@remotebox:~$ screen -ls
There is a screen on:
4865.foobarsession (10/05/2012 11:10:57 AM) (Detached)
1 Socket in /var/run/screen/S-user
user@remotebox:~$ screen -r foobarsession
user@remotebox:~$ screen -ls
4865.foobarsession (10/05/2012 11:10:57 AM) (Attached)
1 Socket in /var/run/screen/S-user
user@remotebox:~$
答え2
で開始されたプロセスは、nohup ... &
ターミナル プロセスが終了した後も実行されるように設計されています。このようなプロセスを一時停止するコア UNIX メカニズムはないと思います。ただし、スケジューラは優先度を変更する可能性があります (それほど重要ではないプロセスと見なされる可能性があるため)。
プロセスは引き続き実行されていると確信していますが、パイプのようなものがそれをブロックし、応答を妨げています。