Использование экрана для мониторинга неинтерактивных сценариев (или другого решения)
У меня есть несколько автономных скриптов, которые запускают команды на удаленных машинах через ssh. Эти сценарии основаны на получении stdout, stderr и кода возврата каждой команды. Я хочу иметь возможность отслеживать ход выполнения сценариев на каждой целевой машине, чтобы видеть, зависло ли что-то, и, возможно, вмешаться в случае необходимости.
Моя первоначальная идея состояла в том, чтобы сценарии запускали команды в сеансе экрана, чтобы наблюдающий мог просто присоединиться к сеансу с помощью screen -x
, Однако это было трудно сделать из сценария, поскольку screen - это интерактивная программа. Я могу отправить команду на сеанс экрана с screen -S session -X stuff "command^M"
, но тогда я не получаю вывод и код возврата, который мне нужен обратно.
Моя вторая идея была поставить script /path/to/log
в ~/.bash_profile
и записать весь сеанс в файл. Тогда наблюдатель может просто записать файл журнала. Тем не менее, это не обеспечивает интерактивность, которую я искал.
Есть идеи, как решить эту проблему?
5 ответов
Много человеческого взаимодействия.. Я бы предложил:
- Разверните Check_MK и настройте его мониторинг журналов.
- Передайте вывод сценария в файлы журнала и установите монитор 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>