端末停止中にプロセスが終了しないように設定する方法

端末停止中にプロセスが終了しないように設定する方法

[編集する]

簡単に。

java xxx...マシンAでパテコールを使用してマシンBから接続しています。ただし、Bマシンにはアクセスできません。java xxx...マシンBがシャットダウンしたときにシャットダウンできない実行中のプロセスを設定するために、マシンCからマシンAにどのように接続しますか?

[オリジナル]

私はパテを使用してサーバー(マシンA)に接続しており、そのサーバーでプロセスが実行されています。ただし、コンピュータ(コンピュータB)を再起動する必要があるため、接続とパテが失われる可能性があります。実行中のプロセスにnohupを設定していないため、このプロセスが終了する可能性があります。disown何らかの理由でパテを使用して設定することはできません。だから私はマシンCを使ってサーバー(マシンA)へのパテ接続を開き、マシンBが再起動したときにプロセスが終了しないように実行中のプロセスを設定したいと思います。

これを行う方法はありますか?disown私が使用できるのと同じシェルプロセスを使用しているかどうかを知っています。しかし、もはやそうではありません。

答え1

プロセスが SIGHUP 信号を無視するようにデバッガを接続できます。

gdb --pid="$pid" --batch -ex 'call signal(1,1)' -ex detach

$pidプロセスのIDはどこにありますか?)これを拡張してstdout / stdin / stderrをリダイレクトすることもできます。ただし、プロセスを別の端末に再接続する方法について、ここで説明されている他の質問も確認できます。reptyrこのサイトを検索)。

別のオプションは、Javaプロセスを制御する医師端末を割り当てて駆動するプロセスを一時停止することです。これにより、ssh接続が終了しても死ぬことはなく、javaが端末にあまり書いていない限り影響を受けません。

これはプロセステストですsleep

$ pstree -sp "$(pidof sleep)"
init(1)───sshd(5701)───sshd(62826)───sleep(62842)
$ kill -s STOP 62826

sleepこれで実行中のSSHクライアントを終了します。

$ ps -fC sleep
UID        PID  PPID  C STIME TTY          TIME CMD
root     62842 62826  0 09:50 pts/8    00:00:00 sleep 100

sshdJavaプロセスが終了したら、完全に終了できるようにプロセスを再起動する必要があります。

答え2

killコマンドに機会を与えて特定の信号を提供したいのですが、まだこれを行うのに適した信号を見つけることができませんでした。組み込みの機能ではこれを行うことができないと言いたいと思います。しかし、誰かが次のようなコードを書いています。

実行中のプロセスを拒否し、それを新しいスクリーンシェルに接続する方法は?

答え3

あなたの場合、最良の方法は使用することですtmuxまたはscreen

使用方法の例は次のとおりです。tmux画面はほぼ同じです。

  1. サーバーにパテを追加
  2. お気に入りのパッケージマネージャを使用してtmuxをインストールしてください。
  3. 以下を使用して新しいtmuxセッションを開始します。tmux
  4. たとえば、tmuxウィンドウでアプリケーションを実行します。java -jar blah blah
  5. [次へ]をクリックしてtmuxセッションを切断します。CTRL-B D
  6. 次にJavaプロセスを確認したい場合(同じPuttyウィンドウまたは他のシステムのPuttyから):tmux atta

答え4

コマンドを実行する準備ができているため、コマンドを押すと停止状態になり、プログラムは実行されませんが、CTRL-Zプログラムの状態は保存され、いつでも再起動できます。

コマンドを実行して、プログラムにどのジョブIDがあるかを確認できますjobs。一旦識別すると、そうすることができます。bg %your_prog_idプログラムをバックグラウンドで送信すると、セッションを閉じても引き続き実行されます。これで終了すると、プログラムは引き続き実行されます。

関連情報