Dies ist durchaus erwartetes Verhalten, aber vielleicht etwas verwirrend, wenn Sie nicht genau wissen, was die betreffenden Befehle tatsächlich tun. Und nein, es ist keine schädliche Software involviert. Ich werde versuchen zu erklären, was hier eigentlich passiert.
Erstens erhalten Sie beim Ausführen ps ax
eine Liste aller Prozesse, die auf dem System ausgeführt werden, und (einige) ihrer Befehlszeilenargumente.
Zweitens, wenn Sie ausführen grep "nginx"
, liest es von seiner Standardeingabe (da Sie keine Datei angegeben haben, die als Eingabe verwendet werden soll) und gibt alle Zeilen aus, die die Zeichenfolge enthalten nginx
.
In der Shell eines Unix-ähnlichen Systems (z. B. Mac OS X) werden Pipes im Allgemeinen so implementiert, dass im Wesentlichen Befehle von rechts nach links gestartet werden, die Daten jedoch von links nach rechts transportiert werden.
Also, was passiert: Zuerst grep
wird mit dem Argument begonnen nginx
. Zweitens ps
wird mit dem Argument begonnen ax
, und seine Standardausgabe ist an die Standardeingabe des grep
Prozesses gebunden . Wie ps
ausgeführt wird, wird seine Ausgabe an die Standardausgabe zugeführt ps
, das ist dasselbe wie die Standardeingabe grep
. Im Gegenzug grep
sieht bei jeder Zeile, für die Zeichenfolge suchen nginx
, denn das ist, was Sie gesagt, grep
zu tun. Eine solche Zeile erscheint einmal: Der grep-Prozess selbst mit seinen Befehlszeilenargumenten! Daher wird diese Zeile von grep
in grep gedrucktStandardausgabe und alle anderen werden unterdrückt. Im ersten Beispiel ist die Standardausgabe von grep nicht an einen anderen Prozess gebunden. Daher wird sie standardmäßig auf dem Terminal gedruckt. Wenn keine Daten mehr vorhanden sind ps
, wird grep
auch beendet, da alle Befehle miteinander verbunden sind. Es macht keinen Sinn, einen von ihnen ausführen zu lassen, wenn ein anderer fertig ist.
Wenn Sie die Ausgabe des grep durch awk
in xargs kill
, was passiert ist, dass xargs eine Liste erstellt, was es tun würde, ist aber nicht wirklich tut es bis zum Ende. Zu dem Zeitpunkt, zu dem xargs mit dem Aufruf von kill beginnt, ist der grep-Prozess - der den Befehl nginx unter seinen Kommandozeilenparametern hatte - bereits weg. Daher gibt es keinen Prozess, an den Sie ein Signal senden können, und kill
informiert Sie darüber.
Wie Sie sehen, läuft auf Ihrem System kein schädlicher Nginx-Prozess, der Ihre Versuche, ihn zu finden, ausweicht. es gibt nur grep, das immer wieder gestartet wird, jedes Mal, wenn Sie schauen, was sich selbst findet.
Sie können dies vermeiden, indem Sie irgendwo in der Suchzeichenkette Zeichengruppen verwenden, da diese sich selbst nicht finden. Gibt beispielsweise ps ax | grep foobar
den grep-Prozess zurück, ist jedoch ps ax | grep 'fooba[r]'
nicht der Fall, da er fooba[r]
nicht mit dem foobar
einer einfachen Zeichenfolge verglichen wird. ( [r]
passt nur zu einem beliebigen Zeichen r
, also nur r
.) Beachten Sie, dass Sie dazu wahrscheinlich das Argument in übergeben müssen grep
.
Abgesehen davon ist es fast immer unnötig, zuerst zu laufen grep
und dann awk
ohne irgendetwas dazwischen. Anstelle eines ... | grep 'foobar' | awk '{ print $2 }'
vorhergehenden Befehls ...
können Sie einfach verwenden ... | awk '/foobar/ { print $2 }'
, dass awk beide Aufgaben erfüllt. Dies ist am häufigsten anzutreffen cat
, wenn es als " nutzlose Verwendung von cat" bezeichnet wird, aber das Konzept lässt sich gut auf andere Befehle verallgemeinern, wie zum Beispiel grep in Ihrem Fall.