Как запускать долгоживущие скрипты на удаленном сервере

24.06.2021 в 19:00
5775
+4

Зачастую приходится на удаленном сервере запускать скрипты вручную. К примеру, для миграции данных из одного хранилища в другое. Как обычно это происходит: заходим на сервак по ssh, запускаем скрипт, он там нам выводит какой-то прогресс (например, обработанные ID), после чего завершается. Однако, часто бывает так, что нужно запустить долгоживущий скрипт. Мне приходилось запускать скрипты, выполняющиеся несколько дней подряд. При этом, нельзя гарантировать что ssh-соединение не разорвётся из-за нестабильного интернета. И вот тут начинаются проблемы - мы можем не узнать, что скрипт корректно завершил свою работу. Не можем узнать, на каком ID он остановился, если произошла какая-то ошибка. О том, как эту проблему решить, мы и поговорим в этой статье.

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

Давайте подключимся по ssh к нашему серваку. После подключения сразу создадим новый скрин:

screen -R blablabla

где blablabla - это имя нашего создаваемого скрина.

После этого мы оказываемся в новом терминале без какой-либо истории. Давайте выполним теперь в этом терминале какую-нибудь команду. К примеру:

echo 123

echo 123

После чего можно попробовать отключиться от терминала. Для этого нужно сначала нажать сочетание клавиш CRTL + A, а затем нажать клавишу D.

В терминале, из которого мы запускали скрин, мы увидим уведомление о том, что мы отключились от скрина:
detach from screen

Теперь давайте снова подключимся к этому скрину. Для этого воспользуемся той же командой:

screen -R blablabla

Вжух! И мы вернулись в тот же терминал, с тем же контекстом, от которого отключались.

Давайте теперь для имитации долгоиграющей команды напишем вот такой простецкий PHP-скрипт:

very_long_script.php

<?php

for ($i = 0; $i < 1000000; $i++) {
    echo $i . PHP_EOL;
    usleep(100000);
}

И запустим его в нашем скрине:

После чего отключимся от скрина сочетанием CTRL+A, затем D.

Затем снова подключимся:

screen -R blablabla

И увидим текущий статус выполнения скрипта.

Можете также отключиться от сервера и снова подключиться к нему по ssh, проверить, что всё работает.

Чтобы завершить скрин, нужно нажать сочетание клавиш CTRL+D. В таком случае мы получим сообщение о завершении, а не об отключении от терминала:

Смотрите, не перепутайте сочетания клавиш =) Теперь если снова запустить

screen -R blablabla

будет снова создан новый терминал.

Если нужно иметь полный лог происходящего, то лучше писать вывод команды в лог-файл. Например, запустив в скрине команду:

php very_long_script.php > very_long_script.log

Следить за изменениями в логе можно с помощью команды:

tail -f very_long_script.log

Всё, теперь никакие разрывы соединений нам не страшны. Всем успешных миграций ;)

loader
24.06.2021 в 19:00
5775
+4
Комментарии
К этому посту больше нельзя оставлять новые комментарии
Логические задачи с собеседований