プロセスJavaはまだ殺されています


11

大学のサーバーでJavaプログラムを実行する必要があります。私は彼らのサーバーを介してssh経由でリモートでログインしています

だから私はそのようにnohupを使いました:

nohup java -jar project.jar &

ただし、ログアウトしてターミナルを閉じてからサーバーに再度ログインすると、プロセスが見つからないか、強制終了されます。


リダイレクトstdoutstderrていくつかのファイルに試します-閉じたターミナルstdout/ に書き込もうとすると、SIGHUP以外のシグナルによってプロセスが強制終了される可能性がありますstderr。たとえば、ジョブの署名の>/dev/null 2>&1前にコマンドに追加します&
Boris Burkov 2014

1
@Bobはと必要はありませんnohup-リダイレクトする必要があるかもしれないが、ほとんどの実装はデフォルトでこれを行いますstdin例えば</dev/null
Graeme

回答:


14

nohupプログラムSIGHUPSIGQUITシグナルおよびシグナルの影響を受けないようにするだけです。最新のシェルは、セッションからログアウトするときに他のシグナルを送信する可能性があるため、で実行している場合でも、プログラムが強制終了されないという保証はありませんnohup

より良いソリューションを使用しているtmuxscreen、またはあなたが使用している場合bash、あなたは試すことができます:

$ java -jar project.jar &
$ disown

を使用する場合はdisown、手動でリダイレクトする必要があります。たとえば、追加</dev/null &>/dev/null
Graeme

@Graeme:シェルを使用しない場合(コマンドを実行して終了するだけ)、リダイレクトする必要はないと思います。
cuonglm 2014

試してくださいssh localhost 'sleep 10m & disown'bash終了しません。
Graeme

[OK]をあるように思わssh端子に接続するプログラムがある場合には終了しません。ただし、インタラクティブに実行する場合は上記で問題ありません。
Graeme

Linux(GNU coreutilsおよびbusybox)およびBSDの実装でnohupは、コマンドはに対して影響を受けSIGQUITず、に対してのみ影響を受けSIGHUPます。それは明示的に標準に反し、AFAIKはSolaris(の一部のバージョン)でのみ発生する可能性があります。
モスビー

13

(慢性的に機能不全)の代わりのさらに別のオプションnohup

setsid java -jar project.jar </dev/zero &>/dev/null &

これは効果的にプロセスを「デーモン化」します。現在はinitが所有しているため、HUPされることはなく、I / Oストリームは安全であり、バックグラウンドに分岐されています。

詳細についてはman setsid、を参照してください。違ってscreentmux、これは所有権を主張し、実行し続けプログラムではありません。独自のプロセスグループでプログラムを起動するだけです。


nohupが機能しないのはなぜですか?
cpugeniusmv 14

@cpugeniusmv何かに役立つと確信していますが、どこかでログインしたり、プロセスを開始したり、ログアウトしたり(OPのように)、それがしばしば推奨される目的で信頼できるとは思いませんでした。私はそれが誤用されたのではないかと思います、そしておそらくsetsidこの方法でもう少し馬鹿な証拠です。nohupによって暗黙的に指定されたステップをスキップします(プロセスをinitによって親のない親として親にします)。 nohup後でジョブをフォアグラウンドにしたい場合は、より柔軟になります。
goldilocks 2014

@ TAFKA'goldilocks '問題は、stdin、stdout、およびstderrの処理にあると思いますが、これは実際には(しかし部分的に(!))nohupでは処理されません。Nohupは主な仕事であり、SIGHUPからプロセスを保護しています。しかし、バッファサイズによっては、ストリームで問題が発生する可能性のある多くの問題が発生します。nohupが間違っているのではなく、nohupが何をするのかについての予想です。
Volker Siegel 14


-2

STDOUTおよびSTDERRをnullにリダイレクトしてnohupを実行してみてください。

nohup java -jar project.jar 2>&1 &

1
stderrをstdoutにリダイレクトするだけで、nohupの動作方法は変更されません(両方にリダイレクトされますnohup.out)。
Gilles「SO-邪悪なこと

1
-1、私はあなたが意味しnohup java -jar project.jar 2>/dev/null &たと思いますが、あなたは明らかにあなたが何をしているのか分かりません。さらに良いことに、餌もstdin /dev/null
PlasmaPower 2014

@PlasmaPowerここにあなたの+1があります。良い一日をお過ごしください:)
boris quiroz 14
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.