バックグラウンドプロセス(nohup &)は、ユーザーがログアウト/ログインすると一時停止/再開します。

バックグラウンドプロセス(nohup &)は、ユーザーがログアウト/ログインすると一時停止/再開します。

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を終了できます。次のようになります。screenCtrl-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 メカニズムはないと思います。ただし、スケジューラは優先度を変更する可能性があります (それほど重要ではないプロセスと見なされる可能性があるため)。

プロセスは引き続き実行されていると確信していますが、パイプのようなものがそれをブロックし、応答を妨げています。

関連情報