Wie kann ich die PS-Ausgabe mit den vorhandenen Headern überprüfen?
Diese beiden Prozesse bilden eine App, die auf meinem Server ausgeführt wird.
root 17123 16727 0 16:25 pts/6 00:00:00 grep GMC
root 32017 1 83 May03 ? 6-22:01:17 /scripts/GMC/PNetT-5.1-SP1/PNetTNetServer.bin -tempdir /usr/local/GMC/PNetT-5.1-SP1/tmpData -D
heißt das 6-22:01:17
, dass es seit 6 Tagen läuft? Ich versuche herauszufinden, wie lange der Prozess schon läuft ...
Ist die 2. Spalte die Prozess-ID? Also, wenn ich es tue kill 32017
, wird der 2. Prozess abgebrochen?
ps -e
wählt alle Prozesse undps -f
ist Vollformat - Liste , die zeigt , die Spaltenüberschriften. Dann leiten wir die Spaltenüberschriften weiter und geben sie an egrep aus.|
Dies ist ein erweitertes grep, das der Pipe eine besondere Bedeutung gibt, nämlich ODER (dieses ODER das). So erhalten Sie eine Übereinstimmung mit der PID in den Spaltenüberschriften und den relevanten Ausgangsleitungen.ps -ef | grep -E 'GMC|PID'
Dank Geekosaurier möchte ich diesen Befehl für Ihre Anforderungen anstelle eines getrennten Befehls verwenden:
Das Schwierige ist, das ";" von der Shell unterstützt, um den Befehl zu verketten.
quelle
ps -ef
wiederholt. Noch besser istps -ef | { head -1 ; grep "your-pattern" ; }
ps -ef | { head -1; grep "pattern" | head -5; }
. Nützlich, wenn das Muster grep-ed viele Ergebnisse hat!Die zweite Spalte ist die Prozess-ID. Der vierte ist der Zeitpunkt, an dem der Prozess erstellt wurde (dies ist normalerweise der Zeitpunkt, an dem Ihr Programm gestartet wurde, aber nicht immer; berücksichtigen Sie
execve()
und Freunde). 6. ist die Menge an CPU-Zeit, die verbraucht wird. Es läuft also seit 8 Tagen und verbraucht fast 7 Tage CPU-Zeit, was ich als besorgniserregend empfinde.Es ist bestenfalls schwierig, den Header im selben Aufruf zu erhalten. Ich würde nur eine separate machen
ps | head -1
. Sie könnten die Verwendungps
eigener Auswahlmethoden in Betracht ziehen oder so etwas wiepgrep
anstelle vongrep
, das eigentlich nicht für die Weitergabe von Kopfzeilen ausgelegt ist.quelle
83
?nice
Wert basiert . Kleinere Nummern haben höhere Priorität. In diesem Fallgrep
ist die Priorität 0, da sie beim Lesen und Schreiben auf der Festplatte blockiert wurde, und siePNetTNetServer.bin
ist eine große Zahl, weil sie ihre Zeitscheibe konsistent verwendet, ohne sie zu blockieren. (Die Planung ist komplex und die Details hängen vom genauen verwendetenDie egrep-Lösung ist einfach und nützlich, aber Sie sind natürlich darauf angewiesen, dass der Header immer 'PID' enthält (eine mehr als vernünftige Annahme) und dass dieselbe Zeichenfolge nicht an anderer Stelle vorkommt. Ich vermute, das ist genug für Ihre Bedürfnisse, aber falls jemand eine Alternative will, gibt es sed.
Mit Sed können Sie einfach sagen: "Drucken Sie die erste Zeile, dann jede Zeile, die das Muster enthält". Beispielsweise:
Hinzufügen
/sed -n/d;
zum Filter sed selbst aus:quelle
/sed -n/d
stimmt nicht. Möglicherweise gibt es einen vorhandenen Befehlsed -n
, den Sie drucken möchten. Trick ist zu gebrauchensed -n '1p; /[P]ROCESS_NAME_TO_SEARCH/p'
. ;-) Notiere[]
um ein beliebiges Zeichen im Suchstring.einfachere Alternative:
ps -ef | { head -1; grep GMC; }
Ersetzen Sie die Zahl durch die Anzahl der Zeilen, in denen Ihre Überschrift angezeigt wird.
quelle
ps -ef | { head -1; grep GMC; }
. Ich mag es auch in einer Funktion wie der folgenden:function pgrep() { ps -ef | { head -1; grep $@; } }
Du könntest die PID mit pgrep bekommen
und dann benutze ps mit der pid
Oder kombinieren Sie die beiden zu einem Befehl
Dies würde nur die gewünschte Zeile anzeigen und die Überschrift enthalten.
quelle
Ich habe ein kleines Perl-Programm geschrieben, das gedruckt wird
Ich verwende es meistens so
ps | 1andre GMC
, aber es kann auch Datei-Argumente annehmen (jede Datei bietet eine eigene Kopfzeile für Übereinstimmungen, die mit Zeilen aus dieser Datei gemacht wurden).quelle