Kommt Yosemite 10.10.5 mit Nginx?

432
DesignT

Ich bin etwas verwirrt, warum ein frischer Yosemite 10.10.5 einen Nginx-Prozess zu haben scheint.

Wenn ich den Befehl ausstelle ps ax | grep "nginx"oderps aux|grep nginx

Ich bekomme:

1266 s000 R+ 0:00.00 grep nginx 

Einige Sekunden später ps ax | grep "nginx"kehrt zurück:

1280 s000 R+ 0:00.00 grep nginx 

Wenn ich es versuche:

ps -lef|grep -i nginx:|awk '{ print $2}'|xargs kill -9 

Ich bekomme:

kill: 1291: No such process 

Der Prozess schließt immer und öffnet einen neuen Prozess.

Der Aktivitätsmonitor zeigt keinen Nginx-Prozess.

Ist das normal? Warum bekomme ich das in einer neuen OS X-Installation?

0

2 Antworten auf die Frage

2
a CVn

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 axeine 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 grepwird mit dem Argument begonnen nginx. Zweitens pswird mit dem Argument begonnen ax, und seine Standardausgabe ist an die Standardeingabe des grepProzesses gebunden . Wie psausgeführt wird, wird seine Ausgabe an die Standardausgabe zugeführt ps, das ist dasselbe wie die Standardeingabe grep. Im Gegenzug grepsieht bei jeder Zeile, für die Zeichenfolge suchen nginx, denn das ist, was Sie gesagt, grepzu tun. Eine solche Zeile erscheint einmal: Der grep-Prozess selbst mit seinen Befehlszeilenargumenten! Daher wird diese Zeile von grepin 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 grepauch 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 awkin 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 killinformiert 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 foobarden grep-Prozess zurück, ist jedoch ps ax | grep 'fooba[r]'nicht der Fall, da er fooba[r]nicht mit dem foobareiner 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 grepund dann awkohne 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.

WOW ... erstaunliche Antwort DANKE DesignT vor 8 Jahren 0
Wenn also nginx wirklich läuft, sollten wir eine Ausgabe mit zwei Zeilen erhalten, eine für den grep-Prozess und die andere für den nginx-Prozess selbst, richtig? DesignT vor 8 Jahren 0
@DesignT Mit dem in der Frage angegebenen Befehl sollten Sie in diesem Fall zwei oder mehr Zeilen sehen, abhängig von der Architektur von nginx und davon, wie OS Xs "ps" Prozesse mit mehreren Threads verarbeitet. a CVn vor 8 Jahren 0
0
Simon Hoare

Sie haben nginx nicht als Prozess installiert / ausgeführt.

Sie könnten nginx durch etwas völlig Neues ersetzen und dasselbe Ergebnis erzielen:

ps ax | grep "boatymcboatface"