私の理解では、デーモンプロセス用のPIDファイルを作成することは一般的に良い考えであり、startproc
はこれらのデーモンを開始するための良い方法です。
startproc
はPIDファイルを参照する-iおよび-p引数を取りますが、PIDファイルを作成したり、開始したデーモンプロセスのIDで更新したりすることはありません。 startproc
が使用されている場合、$!
をエコーしても、正しいプロセス識別子が得られません。
startproc
で始まるデーモンのPIDをどのように引き出すことができるかについて誰かアドバイスがありますか?
その価値のために、私はrcスクリプトを作成していて、非特権ユーザーとしてJVMを起動したいと考えています。私はこのユーザーにログインシェルを与えたくありません(したがって、su -c "Java ..." user
はオプションではありません)。また、デーモンの実行中にルートプロセスがぶら下がることも望んでいません(Sudo -Eu user Java ...
を除外します)。したがって、これらは可能な回避策であることを認めていますが、どちらも理想的ではありません。ただし、これらの代替案に関する私の仮定が間違っている場合は、遠慮なく訂正してください。
それなら、誰もこれを行う方法を知らないようです。
代わりに、Tomcatが基本的に行うことを実行しました。 Java
を直接呼び出すのではなく、シェルスクリプトを記述し、これをサービスから呼び出します。
このシェルスクリプトは、JVMの起動後にecho $!
を使用してPIDファイルを作成する処理も行います。シャットダウンについては、このPIDファイルをチェックし、シャットダウンが成功した後に削除する同様のスクリプトを作成しました。両方のスクリプトは、サービスからSudo -Eu $USER script_name.sh
を使用して呼び出されます。
技術的には、ソリューションはstartproc
をまったく使用しないため、これは私の質問に答えませんが、機能し、実行中のプロセスのコマンドラインを比較するという面倒なタスクを回避します。
同じ問題があり、何かを試しました:
PID=$(startproc -p $PID_FILE <some parameters>)
echo $PID > $PID_FILE
そしてそれは機能しました... SLES 11SP4で試してみました
しかし、SLES 12では、すべてが完全に異なって機能します:(