
まず、私の英語が下手で申し訳ありません。私は 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)