Processo host para múltiplos processos?

1

Estou mantendo um aplicativo que atualmente consiste em 4 processos que dependem um do outro de várias maneiras. No momento, esses processos são iniciados, interrompidos e monitorados por meio de um script bash bastante "maduro", que contém pérolas como essas:

# And another rather dirty way to identify the node Api
# process by knowing the filename that is given to node.js.
# Keep in mind not to kill the retrieved process directly, but
# check the running user and the used port to make sure you
# actually got the correct process.
findApiProcessId() {
    local pid='ps ax | grep node | grep api/server\.js | cut -c -5'

    if [ $pid ]
    then
        echo $pid
     else
        echo -1
    fi
}

Os outros processos são verificados usando meios similares.

Agora estou autorizado a reformular completamente esse gerenciamento de processos, mas, para ser sincero, não tenho a menor idéia de por onde começar. Os processos que preciso monitorar são

  • lighttpd que gerencia um arquivo pid "estável"
  • mongod que gerencia um arquivo pid que não parece ser confiável. Às vezes, aponta para um pid que pertence a um processo totalmente diferente.
  • Pelo menos duas instâncias de node.js (executando com nohup), que tentam manter algum arquivo pid, mas falham miseravelmente.

Eu preciso ser capaz de iniciar e interromper processos únicos e consultar seu status, tudo a partir da linha de comando. E eu preciso ser capaz de iniciar esse programa várias vezes em diretórios diferentes para diferentes "grupos" de nossa aplicação. Os processos filhos atualmente verificam o diretório de trabalho atual para arquivos de configuração e são capazes de "escolher" suas portas sem bloquear outras instâncias em execução.

Meu primeiro pensamento foi escrever um host de processo simples usando Python ou C, mas eu acho que é um pouco exagerado. Então, eu estava procurando uma ferramenta existente, mas procura " ferramenta host do processo linux " não revela nada útil.

Existem algumas ferramentas de host de processo "padrão" que podem monitorar vários processos filhos?

    
por Marcus Riemer 31.01.2013 / 10:00

2 respostas

2

Que tal runit , "um esquema de inicialização do UNIX com supervisão de serviço" ?

Acho que corresponde aos seus requisitos, por exemplo

Eu não posso responder de forma inteligente a "um serviço em algumas variantes" , você pode definir os serviços separadamente ... (pode haver alguma solução symlink-and-examine-my-pwd para isso, mas não tenho certeza se tentar ser esperto aqui é uma boa idéia; pensando em sustentabilidade)

Editar Esta página do ArchWiki fornece uma visão geral rápida pode ser um começo melhor do que a página runit .

    
por 31.01.2013 / 11:00
1

pidof e pgrep ajudarão se você quiser fazer o script (e dispensar o duvidoso ps | lots | of | things idiom). Você também pode filtrar por uid, gid, ppid, mais antigo, mais novo etc.

O comando kill -0 $pid pode ser usado para confirmar que existe um ID de processo específico.

Pode haver complicações se você tiver várias instâncias em diretórios diferentes e não puder diferenciar entre elas por meio de ps . Dependendo da plataforma, você pode ser capaz de distingui-los facilmente por cwd, por ex. no linux verifique /proc/$PID/cwd .

# pgrep httpd
9483
9492
9493
9497
# head -1 /usr/local/apache2/logs/httpd.pid
9483
# kill -0 'head -1 /usr/local/apache2/logs/httpd.pid' && echo $?
0
# ls -l /proc/9483/cwd /proc/9483/exe
lrwxrwxrwx 1 root root 0 2013-01-30 19:40 /proc/9483/cwd -> /
lrwxrwxrwx 1 root root 0 2013-01-30 19:37 /proc/9483/exe -> /usr/local/apache2/bin/httpd

(desculpe, o $ CWD do Apache não é muito interessante ...)

Seu netstat também pode ajudar:

# netstat -plnt | grep :80
tcp        0      0 192.168.123.123:80       0.0.0.0:*               LISTEN     9483/httpd

Um truque comumente usado em scripts de inicialização usados para monitorar processos que não são bons em gerenciar um arquivo PID é iniciá-los de maneira não-daemonizing / não-bifurcação como um job em background com & (embora obviamente programa deve ter um sinalizador não-daemonizing, às vezes referido como% modoinetd), e escreva $! para um arquivo PID você mesmo.

pstree é uma ferramenta útil para rastrear hierarquias de processos:

#  pstree -lnp 9483
httpd(9483)-+-rotatelogs(9484)
            |-rotatelogs(9485)
            |-rotatelogs(9486)
            |-rotatelogs(9491)
            |-httpd(9492)
            |-httpd(9493)-+-{httpd}(9495)
            |             |-{httpd}(9496)
            |             |-{httpd}(9498)
            |             |-{httpd}(9499)
            |             |-{httpd}(9502)
            |             |-{httpd}(9504)
        [... lots more threads snipped ...] 

Como último recurso lsof é a ferramenta multiplataforma para rastrear as coisas por arquivo, conexão ou PID.

Para um sistema de tipo de supervisor de processo padrão, verifique o pacote daemontools do DJB. Seu site é link , embora, francamente, a documentação possa ser um pouco obtusa, há muitas páginas de tutorial como as disponíveis.

Há um carregamento de alternativas (não usado por mim) listado aqui: link

    
por 31.01.2013 / 11:01