As saídas de ps e top não correspondem

0

Eu tenho uma situação em que tenho um processo, digamos script.pl ( aqui é), o que parece ficar na saída para ps auxw | grep script.pl , às vezes quando a carga é pesada ela fica por vários minutos. Esse script é chamado de 5 a 10 vezes por segundo por outro processo (esse processo faz uma chamada não-bloqueante para o script da seguinte forma: System(/some/path/script.pl &) ).

No começo, fiquei preocupado que esse roteiro, por algum motivo, não fosse concluído em tempo hábil e, portanto, atrapalhasse outras coisas. No entanto, tudo o que o script faz é escrever uma mensagem para outra caixa através de um socket TCP.

E é aí que as coisas ficam estranhas. 1) Eu posso verificar esta operação de soquete (a única coisa que o script faz) completa visualizando os logs na outra caixa - ela recebe a mensagem imediatamente e no horário. 2) Embora eu veja muitas instâncias de (aparentemente concluído) script.pl instâncias em ps output, não vejo entradas correspondentes se fizer algo como top -n 1 | grep script.pl - isso parece indicar script.pl não está usando quaisquer recursos; na verdade, não há instâncias de script.pl nessa saída.

Então, finalmente, há algum problema conhecido com ps ou o interpretador Perl que poderia levar a scripts Perl completos pendurados em ps output, mas não top output?

Obrigado!

EDIT: Alterei a chamada de comando superior para: top -n 1 -u script_pl_user | grep script.pl . Agora o processo aparece igualmente em ambos os lugares. No entanto, em top , está mostrando o uso da CPU de 0,0% e nenhum uso de memória muito pequeno. Por que o script.pl está por aí mesmo que suas operações estejam concluídas?

    
por kmarks2 13.05.2013 / 15:32

1 resposta

1

Isso se deve à mecânica do ps e do topo.

Top simplesmente agrega o uso pelo PID, e a chamada do Sistema no Perl essencialmente usa o fork nativo do SO, que cria um processo filho. Processos filho têm o mesmo PID que o pai. ps enumera todos os processos em execução. Por exemplo, observe que a mesma coisa vale para o Apache. Se você fizer o Top e encontrar o Apache, você verá apenas uma entrada, mas se você fizer um ps aux e encontrar o Apache lá, existem várias entradas com o mesmo PID.

Realmente, o top destina-se a encontrar o uso total de recursos de um programa, portanto você não quer ver o valor que cada filho está usando, e o ps é descobrir quais programas estão sendo executados, em detalhes, para que você deseje ver todos os processos filhos.

    
por 13.05.2013 / 15:57