Yosemite 10.10.5 поставляется с nginx?

247
DesignT

Я немного сбит с толку, почему свежий Yosemite 10.10.5, кажется, имеет процесс nginx.

Если я выдаю команду ps ax | grep "nginx"илиps aux|grep nginx

Я получил:

1266 s000 R+ 0:00.00 grep nginx 

Через несколько секунд ps ax | grep "nginx"возвращается:

1280 s000 R+ 0:00.00 grep nginx 

Если я попробую:

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

Я получил:

kill: 1291: No such process 

Процесс всегда закрывается и открывается новый процесс.

Монитор активности не показывает процесс nginx.

Это нормально? Почему я получаю это в новой установке OS X?

0

2 ответа на вопрос

2
a CVn

Это вполне ожидаемое поведение, но, возможно, несколько запутанное, если вы не знаете точно, что на самом деле делают задействованные команды. И нет, нет никакого мошеннического программного обеспечения. Я постараюсь объяснить, что на самом деле здесь происходит.

Во-первых, при запуске ps axвыдается список всех процессов, запущенных в системе, и (некоторые из них) их аргументы командной строки.

Во-вторых, когда вы запускаете grep "nginx", он будет читать из стандартного ввода (поскольку вы не указали файл, который будет использоваться в качестве ввода) и выводить все строки, содержащие строку nginx.

В оболочке Unix-подобной системы (такой как Mac OS X) каналы обычно реализуются таким образом, что, по сути, означает, что команды запускаются справа налево, а данные переносятся слева направо.

Итак, вот что происходит: сначала grepначинается с аргумента nginx. Во-вторых, psзапускается с аргументом ax, а его стандартный вывод привязывается к стандартному вводу grepпроцесса. При psзапуске его выход подается на стандартный вывод ps, что аналогично стандартному вводу grep. В свою очередь, grepсмотрит на каждую строку, ищет строку nginx, потому что это то, что вы сказали grepделать. Такая строка появляется один раз: сам процесс grep со своими аргументами командной строки! В результате эта строка печатается grepв grepстандартный вывод, а все остальные подавляются. В первом примере стандартный вывод grep не привязан ни к какому другому процессу, поэтому по умолчанию он выводится на терминал. Когда больше нет данных из ps, то grepтакже завершается, потому что все команды связаны друг с другом; не имеет никакого реального смысла, чтобы один из них выполнялся, когда другой закончил.

Когда вы перенаправляете выходные данные grep awkв xargs kill, то происходит то, что xargs создает список того, что он собирается делать, но на самом деле не делает этого до конца. Таким образом, к тому моменту, когда xargs приступит к вызову kill, процесс grep, у которого nginx был одним из параметров командной строки, уже ушел. Следовательно, нет никакого процесса, чтобы послать сигнал, и killуведомляет вас об этом факте.

Как вы можете видеть, в вашей системе не запущен мошеннический процесс nginx, уклоняющийся от ваших попыток найти его; есть только grep, который запускается многократно, по одному разу при каждом взгляде, который находит себя.

Вы можете избежать этого, используя группы символов где-то в строке поиска, потому что это не найдет себя. Например, ps ax | grep foobarвозвращает процесс grep, но ps ax | grep 'fooba[r]'не возвращает, потому что fooba[r]это не то же самое, что foobarпри сравнении с простой строкой. ( [r]соответствует любому из символов r, поэтому только r.) Обратите внимание, что для того, чтобы сделать это, вы, вероятно, должны экранировать аргумент grep.

Кроме того, почти всегда нет необходимости сначала запускать, grepа потом уже awkничего между ними. Вместо какой- ... | grep 'foobar' | awk '{ print $2 }'либо предыдущей команды ...вы можете просто использовать ... | awk '/foobar/ { print $2 }'awk для выполнения обеих обязанностей. Это чаще всего встречается там cat, где это называется бесполезным использованием cat, но эта концепция хорошо подходит и для других команд, таких как grep в вашем случае.

ВАУ ... удивительный ответ СПАСИБО DesignT 7 лет назад 0
Так что, если nginx действительно работал, мы должны получить вывод с двумя строками, одна для процесса grep, а другая для самого процесса nginx, правильно? DesignT 7 лет назад 0
@DesignT С помощью команды, приведенной в вопросе, в этом случае вы должны увидеть две или более строки, в зависимости от архитектуры nginx и того, как OS X `ps` обрабатывает процессы с несколькими потоками. a CVn 7 лет назад 0
0
Simon Hoare

У вас не установлен / работает nginx как процесс.

Вы можете заменить nginx на что-то полностью придуманное и получить тот же результат:

ps ax | grep "boatymcboatface" 

Похожие вопросы