スクリーンコマンドプロセスID

スクリーンコマンドプロセス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

書きたい4333プロセス ID を PID ファイルへ

答え1

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

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

$! はバックグラウンドプロセス用ですが、screen は厳密にはバックグラウンドプロセスではありません

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

screen -dmS

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

画面のPIDは次のようにして見つけることができます。

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

画面のPIDを終了すると、画面内で実行されているものも終了するはずです。

デタッチされた画面のPIDが十分でないことが確実な場合は、pgrepを使用してJavaのPIDを取得してみてください。

答え2

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

実際、あなたの screen の試みには 2 つの問題があると思います。まず、その screen コマンドは、java コマンドが完了するまで (または対話型ユーザーが何かを入力するまで) 終了/バックグラウンドになりません。次に、$!ここでは実際には必要なことが行われません。

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

screen -d -m -S someserver java -jar /home/someserver/someserver.jar

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

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

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

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

子プロセスのプロセス ID が本当に必要な場合は、次のようにすればうまくいきます。

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

関連情報