У меня есть ситуация, когда у меня есть процесс, скажем, script.pl
( Вот это), который, кажется, торчит в выводе ps auxw | grep script.pl
Иногда, когда нагрузка велика, она задерживается на несколько минут. Этот сценарий вызывается 5-10 раз в секунду другим процессом (этот процесс выполняет неблокирующий вызов сценария следующим образом: System(/some/path/script.pl &)
).
Сначала я волновался, что этот сценарий по какой-то причине не может быть завершен своевременно и, таким образом, замедляет другие вещи. Однако все, что делает скрипт - это записывает сообщение в другой ящик через сокет TCP.
И вот тут все становится странным. 1) Я могу проверить, завершается ли эта операция сокета (единственное, что делает скрипт), просматривая журналы в другом окне - он получает сообщение немедленно и вовремя. 2) Хотя я вижу много случаев (казалось бы, завершено) script.pl
случаи в ps
вывод, я не вижу соответствующих записей, если я делаю что-то вроде top -n 1 | grep script.pl
- это, кажется, указывает script.pl
не использует никаких ресурсов; на самом деле нет никаких примеров script.pl
в этом выводе.
Итак, наконец, есть ли известные проблемы с ps
или интерпретатор Perl, который может привести к тому, что завершенные сценарии Perl будут ps
вывод, но не top
выход?
Спасибо!
РЕДАКТИРОВАТЬ: я изменил верхний вызов команды на: top -n 1 -u script_pl_user | grep script.pl
, Теперь процесс проявляется одинаково в обоих местах. Однако в top
, он показывает загрузку процессора 0,0% и не использует очень или очень очень мало памяти. Почему скрипт script.pl задерживается, хотя его операции проверены на завершение?
top
показывает толькоn
процессы, гдеn
зависит от размера терминала. По умолчанию он упорядочен по загрузке процессора, поэтому вы не увидите процессов, которые не слишком загружают процессор. Так почему вы ожидаете, что ваш скрипт должен быть указан в этом (усеченном) топ-списке?ps ax
показывает все процессы.top -n 1 -u script_pl_user | grep script.pl
, Мой главный вопрос остается, почему script.pl все еще появляется вtop
а такжеps
хотя операция, которую он должен был сделать, подтверждена, чтобы быть завершенной? Почему они торчат?Ответы:
Это связано с механикой ps и top.
Top просто агрегирует использование по PID, а системный вызов в Perl по существу использует встроенный в ОС fork (), который создает дочерний процесс. Дочерние процессы имеют тот же PID, что и родительский. ps перечисляет все запущенные процессы. Например, обратите внимание, что то же самое относится и к Apache. Если вы зайдете в Top и найдете Apache, вы увидите только одну запись, но если вы сделаете ps aux и найдете там Apache, есть несколько записей с одинаковым PID.
Действительно, top предназначен для определения общего использования ресурсов программой, поэтому вы не хотите видеть сумму, которую использует каждый дочерний элемент, а ps - детально, чтобы узнать, какие программы запущены, поэтому вы хотите увидеть все ребенок обрабатывает.
источник