Использование экрана для мониторинга неинтерактивных сценариев (или другого решения)

У меня есть несколько автономных скриптов, которые запускают команды на удаленных машинах через ssh. Эти сценарии основаны на получении stdout, stderr и кода возврата каждой команды. Я хочу иметь возможность отслеживать ход выполнения сценариев на каждой целевой машине, чтобы видеть, зависло ли что-то, и, возможно, вмешаться в случае необходимости.

Моя первоначальная идея состояла в том, чтобы сценарии запускали команды в сеансе экрана, чтобы наблюдающий мог просто присоединиться к сеансу с помощью screen -x, Однако это было трудно сделать из сценария, поскольку screen - это интерактивная программа. Я могу отправить команду на сеанс экрана с screen -S session -X stuff "command^M", но тогда я не получаю вывод и код возврата, который мне нужен обратно.

Моя вторая идея была поставить script /path/to/log в ~/.bash_profile и записать весь сеанс в файл. Тогда наблюдатель может просто записать файл журнала. Тем не менее, это не обеспечивает интерактивность, которую я искал.

Есть идеи, как решить эту проблему?

5 ответов

Много человеческого взаимодействия.. Я бы предложил:

  1. Разверните Check_MK и настройте его мониторинг журналов.
  2. Передайте вывод сценария в файлы журнала и установите монитор Check_MK на наличие ошибок

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

Я использую php для сценария оболочки для управления моим сервером Minecraft. Я использую журнал сервера, чтобы получить мои ответы. Вот код, который я использую, чтобы перечислить, кто в сети. я использую tail чтобы получить последние несколько строк и проанализировать их на время, чтобы убедиться, что ответ после, когда я отправил команду.

#!/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;
        }
}

Вы должны посмотреть на ткань. Он делает то, что вы описываете, что вы ищете. Вам нужно будет выполнить некоторые скрипты Python-ish. Вы сможете запускать свои скрипты. Возможно, вам будет эффективнее выполнить команду из Fabric. Вы поймете, что я имею в виду; запустить учебник. http://docs.fabfile.org/0.9.2/

Я хотел бы предложить использовать "nohup" - это выведет стандартный вывод в nohup.out. Вы можете запустить скрипт с помощью nohup и безопасно выйти из системы, и он продолжит работать. Проверьте man nohup для более подробной информации.

Типичное использование #> nohup /usr/local/bin/myscript.sh &

Он запустит сценарий в bg и не потребует от вас входа в систему. Nohup.out будет находиться в текущем рабочем каталоге, когда он будет запущен, или $HOME/nohup.out, если perms не разрешит этого. После этого вы можете проверить содержимое nohup.out на наличие проблем, которые вам необходимо решить, и решить их соответствующим образом.

Теперь, чтобы учесть вашу интерактивность, вы можете запустить скрипт, используя screen и nohup, таким образом, вы можете вернуть процесс на передний план, если он завис в ожидании вашего ввода.

Надеюсь это поможет

Если вы хотите использовать экран, вы можете попробовать что-то вроде этого:

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

-d -m Комбинация аргументов заставляет экран начать новый сеанс, но не присоединяется к нему.

Я использую вариант этой команды для запуска "демонов", которые не демонизируются (например, Minecraft) при запуске, и это прекрасно работает. Я могу подключиться к screen сессию позже и посмотрите полный вывод и выполните команды сервера как обычно. Ниже приведен вариант сценария запуска, который запускает сеанс экрана от имени пользователя, отличного от root (для /etc/rc.local):

sudo -u <someuser> -i screen -d -m <command>
Другие вопросы по тегам