Usando a tela para monitorar scripts não interativos (ou alguma outra solução)

1

Eu tenho alguns scripts autônomos que executam comandos em máquinas remotas sobre o ssh. Esses scripts dependem de obter stdout, stderr e o código de retorno de cada execução de comando. Eu quero ser capaz de monitorar o progresso dos scripts em cada máquina de destino para que eu possa ver se algo foi interrompido e possivelmente intervir, se necessário.

Minha ideia inicial era fazer com que os scripts executassem comandos em uma sessão de tela, para que o monitoramento de pessoas pudesse simplesmente anexar à sessão com screen -x . No entanto, foi difícil fazer isso a partir de um script, pois a tela é um programa interativo. Eu posso enviar um comando para a sessão de tela com screen -S session -X stuff "command^M" , mas então eu não recebo a saída e o código de retorno que eu preciso de volta.

Minha segunda ideia foi colocar script /path/to/log em ~/.bash_profile e registrar toda a sessão em um arquivo. Então, a pessoa de monitoramento poderia simplesmente seguir o arquivo de log. No entanto, isso não fornece a interatividade que eu estava procurando.

Alguma ideia de como resolver este problema?

    
por Michael 08.11.2010 / 19:17

5 respostas

1

Eu uso php para um script de shell para gerenciar meu servidor Minecraft. Eu uso o log do servidor para obter minhas respostas. Aqui está o código que eu uso para listar quem está online. Eu uso tail para obter as últimas linhas e analisá-las pelo tempo necessário para garantir que a resposta seja posterior ao envio do comando.

#!/usr/bin/php
<?php
function send_cmd( $command )
{
        exec('screen -S minecraft -X stuff "'printf "\r' . $command . '\r"'"');
}

function who()
{
        if (!is_running())
        {
                echo 'Server is not running.' . CRLF;
                return 4;
        }

        // Get the current time and send the command
        $before = time() - 1;
        send_cmd('list');

        // Wait for the server to provide a response
        while(time() < $before + 5) {
                sleep(0.25);
                $result = exec('tail ' . __DIR__ . '/server.log | grep "\[INFO\] Connected players"');
                $stamp = strtotime(substr($result, 0, 19));
                if ($before <= $stamp)
                        break;
                unset($result);
        }

        if (isset($result))
        {
                echo $result . CRLF;
                echo 'Server responded in ' . ($stamp - $before) . ' seconds.' . CRLF;
                return 0;
        }
        else
        {
                echo 'Server did not respond.' . CRLF;
                return 4;
        }
}
    
por 09.01.2011 / 19:16
1

Muita interação humana ... Eu sugeriria:

  1. Implemente Check_MK e configure seu monitoramento de log
  2. Canalize a saída do script para os arquivos de log e faça com que o Check_MK monitore erros

Nesse cenário, uma pessoa só é alertada quando algo dá errado. Eles têm a chance de revisar a mensagem de log por meio de uma interface da Web, reconhecê-los para que outras pessoas da equipe saibam que as coisas estão sendo tratadas e decidir quando agir com base na natureza do problema.

    
por 05.02.2011 / 03:58
0

Gostaria de sugerir o uso de "nohup" - isso gerará o stdout em nohup.out. Você pode bg o script com nohup e com segurança sair e continuará a ser executado. Confira man nohup para mais detalhes.

O uso típico é # > nohup /usr/local/bin/myscript.sh &

Ele executará o script no bg e não exigirá que você permaneça logado. O nohup.out estará no diretório de trabalho atual quando for executado, ou $ HOME / nohup.out se os perms não permitir. Você pode então verificar o conteúdo de nohup.out para quaisquer problemas que você precise resolver e lidar com eles de acordo.

Agora, para lidar com sua interatividade, você pode executar o script usando a tela e o nohup, dessa forma, você pode trazer o processo de volta ao primeiro plano se ele estiver aguardando sua entrada.

Espero que isso ajude

    
por 08.11.2010 / 20:54
0

Você deve olhar para o Fabric. Faz exatamente o que você descreve você está procurando. Você precisará fazer alguns scripts Python-ish. Você poderá executar seus scripts. Você pode achar mais eficaz executar o comando do Fabric. Você vai ver o que quero dizer; execute o tutorial. link

    
por 17.11.2010 / 03:29
0

Se você quiser usar a tela, pode tentar algo assim:

ssh user@address screen -d -m <command>

A combinação do argumento -d -m faz a tela iniciar uma nova sessão, mas não se anexa a ela.

Eu uso uma variante desse comando para executar "daemons" que não são daemonize (como o Minecraft) na inicialização e funciona bem. Eu posso conectar-me à sessão screen mais tarde e ver a saída completa e emitir comandos do servidor como normal. Abaixo está a variante do script de inicialização, que executa a sessão de tela como alguém diferente de root (para /etc/rc.local):

sudo -u <someuser> -i screen -d -m <command>
    
por 17.11.2010 / 05:25