Das Anzeigen der Ausgabe von „ps aux | grep blah“ in tmux funktioniert nicht?

Das Anzeigen der Ausgabe von „ps aux | grep blah“ in tmux funktioniert nicht?

Ich versuche, dies in einer tmux-Sitzung auszuführen watch "ps aux | grep myShittyProcess". Dieser Prozess myShittyProcesswurde auch in einer tmux-Sitzung gestartet. Das ps auxfunktioniert ohne Watch-Befehl. Aber sobald ich es in Watch eingebe, schlägt die Ausführung fehl. Wie bekomme ich das zum Laufen?

-- bearbeiten -

Habe festgestellt, dass es funktioniert, wenn man die Größe von tmux auf Vollbild ändert. Hat etwas mit psder Ausgabeumbruchfunktion zu tun und grepist nicht in der Lage, sie im umbrochenen Kontext zu finden.

Antwort1

Wie in der Fragebearbeitung erwähnt undxzfcs Antwort, das Problem scheint mit dem Zeilenumbruch von tmux zusammenzuhängen. ps aux | grep [q]uoteWenn Sie keine Benutzerinformationen benötigen und eher einen Drop-In-Ersatz für suchen, versuchen Sie Folgendes:

$ pgrep -af [q]uote
392 bash -c sleep 5 && echo quote
399 bash -c sleep 5 && echo second quote

$ watch pgrep -af [q]uote

Das -aFlag bewirkt, dass die Ausgabe die Befehlszeilenargumente enthält, während -fSie mit dem Flag nicht nur nach den Befehlszeilenargumenten, sondern auch nach dem Prozessnamen suchen können.

Antwort2

Laufen

watch "COLUMNS= ps aux | grep TheProcessYouWatch"

Erklärung: watchsetzt bestimmte zusätzliche Umgebungsvariablen, nämlich COLUMNSund LINES. Dies kann leicht durch Vergleichen von env | grep COLUMNSund überprüft werden watch 'env | grep COLUMNS'.

Wenn COLUMNSgesetzt ist, pswird die Ausgabe auf die angegebene Anzahl Zeichen pro Zeile gekürzt, selbst wenn die Ausgabe weitergeleitet wird grep(oder an etwas anderes). ( ps, warum tust du mir das an?). Das Erzwingen COLUMNSeiner Leerzeile innerhalb watchvon 's Befehl reicht aus, damit pses wie von OP (und mir) erwartet funktioniert.

Um zu verhindern watch, dass grepProzesse Teil Ihrer beobachteten Ausgabe werden, können Sie []Folgendes hinzufügen:

watch "COLUMNS= ps aux | grep [T]heProcessYouWatch"

(Natürlich empfehle ich, sich pgrepauch damit vertraut zu machen. Andere Antworten werden dabei hilfreich sein.)

Antwort3

psist ein Dienstprogramm, das eine für Menschen lesbare Ausgabe erzeugt, und sich auf das Greppen von für Menschen lesbarem Text zu verlassen, ist keine gute Idee. Sie sollten pgrep myShittyProcessanstelle von verwenden ps aux | grep myShittyProcess. pgreperzeugt eine bloße Liste von PIDs, und wenn Sie eine weniger langweilige Ausgabe möchten, können Sie pgrepdie Ausgabe von an übergeben ps:

ps -opid,user,args -p `pgrep myShittyProcess`

Um diesen Einzeiler mit zu verwenden, watchsollten Sie ihn in ' '(nicht " ") einschließen, um eine frühzeitige Ersetzung des Shell-Befehls zu verhindern:

watch 'ps -opid,user,args -p `pgrep myShittyProcess`'

verwandte Informationen