複数のバックグラウンドプロセスの識別子を設定するには?

複数のバックグラウンドプロセスの識別子を設定するには?

私はカスタムゲームサーバーを作成しており、それを実行する.jarファイルがあります。単一の仮想マシン(15台など)で複数のゲームサーバーを起動する必要があります。私は次のように実行できることがわかりました。

java -jar server-1.0.jar &

ただし、これを入力すると、、、およびのみps表示されます。サーバー6、サーバー9などをどのように識別しますか?何を使うべきですか?PIDCMDTTYTIME

答え1

pidバックグラウンドタスクを開始するとすぐに、次のことを記録できます。

command & pid1=$!
command & pid2=$!

$!最後に開始されたバックグラウンドジョブのpid。

スクリプトまたはプログラムのプロセス属性を介してpidを取得するツールを使用することは賢明ではありません。

プロセスは常に子を追跡する必要があります。ps/...パスをたどると、無実のpgrep被害者(=自分ではありませんが、誤ってクエリと一致するプロセス)を終了(=シグナル)する危険があります。


正しいPIDをターゲットにしていますが、そのPIDが子供ではない場合でも、これらのリスクが発生する可能性があります。スロットpidは、プロセスが終了し、その親がwaitそのプロセスにあるまで予約されます(親のみがプロセスwaitに存在する可能性があります)。 aがあなたのものではない場合、あなたがaについて知った時点と信号を送信した時点の間にaが死んで待っている可能性がありますpidpidこれにより、罪のない被害者(競争条件)を標的にすることもできます。

答え2

たとえば、-fスイッチを使用してpsより多くの情報を表示します。バラよりman ps

-f 完全な形式のリストを作成してください。このオプションは、他の多くのUNIXスタイルオプションと組み合わせて使用​​して追加の列を追加できます。これはまた、次の結果をもたらしました。 印刷するコマンドパラメータ。と一緒に使用すると、-LNLWP(スレッド数)とLWP(スレッドID)列が追加されます。c オプション、型キーワード引数、型キーワード通信を参照してください。

関連情報