Выходы ps и top не совпадают

0

У меня есть ситуация, когда у меня есть процесс, скажем, 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 задерживается, хотя его операции проверены на завершение?

kmarks2
источник
1
top показывает только n процессы, где n зависит от размера терминала. По умолчанию он упорядочен по загрузке процессора, поэтому вы не увидите процессов, которые не слишком загружают процессор. Так почему вы ожидаете, что ваш скрипт должен быть указан в этом (усеченном) топ-списке? ps ax показывает все процессы.
mpy
Да. Я изменил свой главный звонок на top -n 1 -u script_pl_user | grep script.pl, Мой главный вопрос остается, почему script.pl все еще появляется в top а также ps хотя операция, которую он должен был сделать, подтверждена, чтобы быть завершенной? Почему они торчат?
kmarks2

Ответы:

1

Это связано с механикой ps и top.

Top просто агрегирует использование по PID, а системный вызов в Perl по существу использует встроенный в ОС fork (), который создает дочерний процесс. Дочерние процессы имеют тот же PID, что и родительский. ps перечисляет все запущенные процессы. Например, обратите внимание, что то же самое относится и к Apache. Если вы зайдете в Top и найдете Apache, вы увидите только одну запись, но если вы сделаете ps aux и найдете там Apache, есть несколько записей с одинаковым PID.

Действительно, top предназначен для определения общего использования ресурсов программой, поэтому вы не хотите видеть сумму, которую использует каждый дочерний элемент, а ps - детально, чтобы узнать, какие программы запущены, поэтому вы хотите увидеть все ребенок обрабатывает.

Seth Curry
источник
Любая идея, почему процесс продолжает отображаться для ps или top, когда завершилась завершенная операция? Может быть, проблема в том, что настоящий Perl выполняет интерпретацию? Благодарю.
kmarks2
1
это это ссылка на то, что я подозреваю, что происходит. По некоторым причинам, я думаю, что вы создаете "зомби", потому что ваши дочерние процессы не завершаются правильно. Это ошибка в вашем Perl, а не в интерпретаторе. Я действительно не знаю много Perl, поэтому я не могу дать вам намного больше, надеюсь, эта ссылка будет полезна для вас.
Seth Curry