web-dev-qa-db-ja.com

startprocで開始されたプロセスのPIDをどのように見つけますか?

私の理解では、デーモンプロセス用のPIDファイルを作成することは一般的に良い考えであり、startprocはこれらのデーモンを開始するための良い方法です。

startprocはPIDファイルを参照する-iおよび-p引数を取りますが、PIDファイルを作成したり、開始したデーモンプロセスのIDで更新したりすることはありません。 startprocが使用されている場合、$!をエコーし​​ても、正しいプロセス識別子が得られません。

startprocで始まるデーモンのPIDをどのように引き出すことができるかについて誰かアドバイスがありますか?


その価値のために、私はrcスクリプトを作成していて、非特権ユーザーとしてJVMを起動したいと考えています。私はこのユーザーにログインシェルを与えたくありません(したがって、su -c "Java ..." userはオプションではありません)。また、デーモンの実行中にルートプロセスがぶら下がることも望んでいません(Sudo -Eu user Java ...を除外します)。したがって、これらは可能な回避策であることを認めていますが、どちらも理想的ではありません。ただし、これらの代替案に関する私の仮定が間違っている場合は、遠慮なく訂正してください。

3
Adam George

それなら、誰もこれを行う方法を知らないようです。

代わりに、Tomcatが基本的に行うことを実行しました。 Javaを直接呼び出すのではなく、シェルスクリプトを記述し、これをサービスから呼び出します。

このシェルスクリプトは、JVMの起動後にecho $!を使用してPIDファイルを作成する処理も行います。シャットダウンについては、このPIDファイルをチェックし、シャットダウンが成功した後に削除する同様のスクリプトを作成しました。両方のスクリプトは、サービスからSudo -Eu $USER script_name.shを使用して呼び出されます。

技術的には、ソリューションはstartprocをまったく使用しないため、これは私の質問に答えませんが、機能し、実行中のプロセスのコマンドラインを比較するという面倒なタスクを回避します。

1
Adam George

同じ問題があり、何かを試しました:

PID=$(startproc -p $PID_FILE <some parameters>)
echo $PID  > $PID_FILE

そしてそれは機能しました... SLES 11SP4で試してみました

しかし、SLES 12では、すべてが完全に異なって機能します:(

0
MaD