Ich versuche, dies in einer tmux-Sitzung auszuführen
watch "ps aux | grep myShittyProcess"
. Dieser Prozess myShittyProcess
wurde auch in einer tmux-Sitzung gestartet. Das ps aux
funktioniert 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 ps
der Ausgabeumbruchfunktion zu tun und grep
ist 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]uote
Wenn 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 -a
Flag bewirkt, dass die Ausgabe die Befehlszeilenargumente enthält, während -f
Sie 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: watch
setzt bestimmte zusätzliche Umgebungsvariablen, nämlich COLUMNS
und LINES
. Dies kann leicht durch Vergleichen von env | grep COLUMNS
und überprüft werden watch 'env | grep COLUMNS'
.
Wenn COLUMNS
gesetzt ist, ps
wird 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 COLUMNS
einer Leerzeile innerhalb watch
von 's Befehl reicht aus, damit ps
es wie von OP (und mir) erwartet funktioniert.
Um zu verhindern watch
, dass grep
Prozesse Teil Ihrer beobachteten Ausgabe werden, können Sie []
Folgendes hinzufügen:
watch "COLUMNS= ps aux | grep [T]heProcessYouWatch"
(Natürlich empfehle ich, sich pgrep
auch damit vertraut zu machen. Andere Antworten werden dabei hilfreich sein.)
Antwort3
ps
ist 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 myShittyProcess
anstelle von verwenden ps aux | grep myShittyProcess
. pgrep
erzeugt eine bloße Liste von PIDs, und wenn Sie eine weniger langweilige Ausgabe möchten, können Sie pgrep
die Ausgabe von an übergeben ps
:
ps -opid,user,args -p `pgrep myShittyProcess`
Um diesen Einzeiler mit zu verwenden, watch
sollten Sie ihn in ' '
(nicht " "
) einschließen, um eine frühzeitige Ersetzung des Shell-Befehls zu verhindern:
watch 'ps -opid,user,args -p `pgrep myShittyProcess`'