bashでプログラム/プロセスが始まるときいいえ nohup
、後で(追加操作を実行して)シェル/ターミナルが閉じた後でもこのプログラムを実行することは可能ですか?
ここに素晴らしい議論があります。nohup、disown、&の違い興味のある人がいる場合は見てください。
この質問では、プログラムがnohupなしで起動したときに観察した内容を共有したいと思います。
編集 - 元の質問を無視します。はい、disown
プロセスの実行後にターミナル/シェルを終了することは重要ではないようです。プロセスが実行されているようです。元の端末が閉じた後もps -ef | grep java
プロセスが実行されていることがわかります。
答え1
上記の制限により、端末を閉じた後もプロセスを実行し続ける方法はありません。なぜ?プロセスにもかかわらず、disown
端末内のシェルはまだjava -jar myapp.jar
プロセスの親です。disown
シェルプロセスはHUP信号を送信しないように指示しますが、java
端末を閉じるとbashプロセスが最初に終了し、シェルの親プロセスがそのjava
プロセスを継承します。その後、この新しい親プロセスはすべての継承されたプロセスをクリーンアップするためにHUP tpを送信し、高度なjava
機能のみを使用してプロセスがHUP信号を受信し、それに応じてアクションを実行するのを防ぎます。nohup
java
答え2
質問した理由は、コマンドを直接起動し、ログアウト後も実行を続けたいと思っていますが、まだコマンドを制御できるようにしたいと思います。
いくつかの要因がプロセスのライフサイクルを制御します。最も重要な2つの側面は、親プロセス(またはプロセスグループ)と制御端末です。
対話型コマンドを実行すると、簡単にバックグラウンドで送信できます(「ctrl + z」で停止し、「bg」でバックグラウンドで続行します)。
今、トリッキーな部分が出てきます。プロセスを別のプロセスグループ(および端末)に接続することです。端末の場合、通常は「screen」を使用し、端末を再接続します。https://github.com/nelhage/reptyr
もちろん、このツールに代わるものもあります。この作業の後、すべてのプロセスが正常に動作するわけではないので、マイレージが異なる可能性があることに注意することも重要です。