そこで私がきちんとした解決策を見つけたい問題は、サーバーにログインしたとき (Solaris と RHEL のインスタンスがいくつかある)、実行中のアプリケーションを調べようとすることです。
$ ps -auxww | grep <thing I look for, usually Java>
そして、プロセス、PID、追加の詳細、そしてそれとともに実行されたプロセス名とパラメータの完全なリストが表示されます。一般的に何が実行されているかを知るのに十分な情報を提供しますが、一部のサーバーは異なる方法で実行されています。異なる目的で使用されるアプリケーションサーバーの複数のインスタンスを持つサーバーがある場合があります。他のプロセスは、私が混在させたハングしたプロセスの残りです。凍結していないプロセス。どのプロセスを終了させる必要があるか分からないため、すべての Java インスタンスをシャットダウンしたくありません。
私が提供したい解決策は、起動スクリプト中に、プロセスの先頭または末尾に短い説明を挿入できるテキストを追加したいということです。これを可能にする方法はありますか?
もし私が尋ねていることが不可能/馬鹿げている/まったく正気ではないと思われるなら、同じことを達成できる別の解決策も検討します。アイデアはいくらでも募集していますが、このアイデアは実行可能だと思いつきました。
答え1
以下は例です重力の提案:
$ MARKER=snooze sleep 120&
$ ps ew | grep -o ".*[M]ARKER=snooze"
11741 pts/2 S 0:00 sleep 120 MARKER=snooze
オプションにより、プロセスの環境が出力されます。e
オプションと正規表現により、検索している部分の後の環境が切り捨てられますが、常にこのようにきれいな結果になるとは限りません (環境のより多くの部分が出力される可能性があります)。 パターンの一部を角括弧で囲むと、結果から 自体を削除するためによく使用される for -機能が実行されます。ps
-o
grep
grep -v
grep
答え2
簡単に見つけられるように、各プロセスに一意のタグを付けたいようですね。実際に、大企業の監視チームがそれを実行していると聞きました。すべてのアプリに、ps と grep で簡単に見つけられる一意のコードが割り当てられていました。
Java では -D を使用して任意の変数を設定できるため、「-Dmonitoringid=」のようなものを簡単に追加できます。プロセスでは無視されますが、簡単に grep で検索できます。
あるいは、アプリケーション サーバーを分割して、それぞれが提供されるアプリケーションに固有の ID で実行されるようにすることもできます。現在、私たちは J2EE アプリケーション サーバーの大規模なファームを運用しており、各ボックスには多数のアプリケーションがありますが、所有権、アクセス、制御などを分割するために、それぞれが独自の ID で実行されます。
これは、ホスト上の任意のアプリケーション サーバーを簡単に見つけられることも意味します。
ps <whichever ps args you like best> | grep java | grep <uid> | grep -v grep