Das Problem, für das ich eine saubere Lösung finden möchte, besteht darin, dass ich beim Anmelden bei einem Server (ich habe einige Solaris- und RHEL-Instanzen) versuche herauszufinden, welche Anwendungen ausgeführt werden:
$ ps -auxww | grep <thing I look for, usually Java>
Und ich bekomme eine schöne Liste von Prozessen, PIDs, zusätzlichen Details und mit dem gesamten Prozessnamen und den Parametern, die damit ausgeführt wurden. Während diesallgemeinliefert mir genügend Informationen, um herauszufinden, was läuft, einige Server werden anders ausgeführt. Ich habe möglicherweise einen Server, auf dem mehrere Instanzen eines App-Servers für unterschiedliche Zwecke verwendet werden. Andere Prozesse sind Überbleibsel eines hängenden Prozesses, den ich mitnicht gefrorenProzesse. Ich möchte nicht alle Java-Instanzen herunterfahren, da ich nicht herausfinden kann, welcher Prozess beendet werden muss.
Die Lösung, die ich anbieten möchte, besteht darin, dass ich während meiner Startskripte einem Prozess Text voranstellen oder anhängen möchte, der es mir ermöglicht, eine kurze Beschreibung einzufügen. Gibt es etwas, mit dem ich dies tun kann?
Wenn meine Frage unmöglich/albern/völlig verrückt klingt, bin ich offen für alternative Lösungen, mit denen ich das Gleiche erreichen kann. Ich bin offen für Ideen, aber diese hier ist mir als machbar erschienen.
Antwort1
Hier ist ein Beispiel fürSchwerkraftAnregung:
$ MARKER=snooze sleep 120&
$ ps ew | grep -o ".*[M]ARKER=snooze"
11741 pts/2 S 0:00 sleep 120 MARKER=snooze
Die e
Option bewirkt, dass ps
die Umgebung des Prozesses gedruckt wird. Die -o
Option und der reguläre Ausdruck bewirken, grep
dass die Umgebung nach dem gesuchten Teil entfernt wird, aber ich würde nicht darauf wetten, dass die Ergebnisse immer so sauber sind (es könnte mehr von der Umgebung gedruckt werden). Wenn ein Teil des Musters in eckige Klammern gesetzt wird, wird die Funktion ausgeführt, die Benutzer häufig für ein grep -v
for verwenden – um das grep
selbst aus den Ergebnissen zu entfernen.
Antwort2
Es klingt, als ob Sie jeden Prozess eindeutig kennzeichnen möchten, damit Sie ihn leicht finden können. Ich habe tatsächlich gehört, dass das bei einem großen Unternehmen von dessen Überwachungsteam gemacht wird – jede App erhielt einen eindeutigen Code, der leicht mit ps und grep gefunden werden konnte.
Unter Java können Sie -D verwenden, um jede Variable festzulegen. Sie können also einfach etwas wie „-Dmonitoringid=“ hinzufügen. Der Prozess würde es ignorieren, aber Sie können einfach danach suchen.
Alternativ können Sie Ihre App-Server aufteilen, sodass jeder unter einer ID ausgeführt wird, die für die jeweilige Anwendung spezifisch ist. Wir betreiben derzeit eine große Farm von J2EE-App-Servern mit vielen Apps auf jeder Box. Allerdings läuft jeder Server unter seiner eigenen ID, um Besitz, Zugriff, Kontrolle usw. aufzuteilen.
Dies bedeutet auch, dass das Auffinden eines beliebigen App-Servers auf einem Host ganz einfach ist:
ps <whichever ps args you like best> | grep java | grep <uid> | grep -v grep