web-dev-qa-db-ja.com

画面コマンドプロセスID

まず第一に私の悪い英語を申し訳ありません、そして私はLinuxで新しいです。

これを行うと、プロセスIDをpidファイルに書き込むことができます

start () {
    echo -n "Starting someserver.jar: "

    Java -jar /home/someserver/someserver.jar &
    echo $! > /home/hcserver/hcserver.pid
}

そして、私がこのコマンドを使用していることを知っていますが、pidファイルに書き込むことができません

start () {
    echo -n "Starting someserver.jar: "

    screen -S someserver Java -jar /home/someserver/someserver.jar
    echo $! > /home/someserver/someserver.pid
}

プロセスIDを取得したり、これを修正したりするにはどうすればよいですか?

編集:

root@server:/home/someserver# ps -ef | grep Java
root      4332     1  0 22:03 ?         SCREEN -S someserver Java -jar /home/someserver/someserver.jar
root      4333  4332  0 22:03 pts/0     Java -jar /home/someserver/someserver.jar
root      4363  3222  0 22:04 pts/3     grep Java

43プロセスIDをpidファイルに書き込みたい

2
C.T

私があなたの質問を理解していると100%確信しているわけではありませんが、試してみましょう:

$!子プロセスの内部からではなく、親シェルから機能します

$!はバックグラウンドプロセス用であり、画面は正確にはバックグラウンドプロセスではありません

また、screen -Sは画面を切り離しません。おそらく、次のような画面オプションがさらに必要になります。

screen -dmS

画面内から$$と$ BASHPIDを試すこともできます

あなたはを使用して画面のpidを見つけることができます

screen -list | grep someserver | cut -f1 -d'.' | sed 's/\W//g'

画面のpidを強制終了すると、画面内で実行されているものもすべて強制終了されます。

切り離された画面のpidが十分でないことを確認した場合は、pgrepを使用してJavaのもののpidを取得してみてください

2
neofutur

つまり、長時間実行されるJavaコマンドをバックグラウンドで開始するスクリプトを、画面で実行するスクリプトに置き換えようとしていますか?

画面の試行には、実際には2つの問題があると思います。まず、そのscreenコマンドは、Javaコマンドが終了する(または対話型ユーザーが何かを入力する)まで終了/バックグラウンドしません。次に、_$!_は実際には実行されません。ここでやりたいことをかなりやってください。

画面を適切に背景にするには、次を使用します。

_screen -d -m -S someserver Java -jar /home/someserver/someserver.jar
_

_-d -m_コンボは、画面を切り離された(バックグラウンド)状態で開始します。これは通常、起動スクリプトに必要なものです。 Javaプロセスが終了すると、自動的に終了してクリーンアップします。

したがって、起動時に画面が適切にバックグラウンド化されたので、プロセスのpidを取得して、プロセスを制御(または少なくとも停止)できるようにする必要があります。しかし、実際には、そのpidをキャプチャするのはかなり難しいです。 _screen -ls_出力の解析、_/proc/_データの解析、および/またはps出力の解析を組み合わせて実行できると思いますが、注意が必要です。代わりに、はるかに簡単な方法は、screen自体を使用してそのプロセスを制御することです。つまり、stop()ルーチンで、Javaプロセスのpidを強制終了する代わりに、次のようにします。

_stop () {
  echo -n "Stopping someserver.jar: "
  screen -X -S someserver quit
}
_

これにより、画面セッション(以前に_-S_で識別済み)に、その制御下にあるすべてのプロセスを強制終了して終了するように指示されます。

子プロセスのプロセスIDが本当に必要な場合は、次のような方法でうまくいくはずです。

_cd /var/run/screen/S-$(whoami)
parentpid=$(ls *.someserver | cut -d. -f1)
pid=$(ps --ppid $parentpid -ho pid)
_
4
freiheit