Как запускать долгоживущие скрипты на удаленном сервере
Зачастую приходится на удаленном сервере запускать скрипты вручную. К примеру, для миграции данных из одного хранилища в другое. Как обычно это происходит: заходим на сервак по ssh, запускаем скрипт, он там нам выводит какой-то прогресс (например, обработанные ID), после чего завершается. Однако, часто бывает так, что нужно запустить долгоживущий скрипт. Мне приходилось запускать скрипты, выполняющиеся несколько дней подряд. При этом, нельзя гарантировать что ssh-соединение не разорвётся из-за нестабильного интернета. И вот тут начинаются проблемы - мы можем не узнать, что скрипт корректно завершил свою работу. Не можем узнать, на каком ID он остановился, если произошла какая-то ошибка. О том, как эту проблему решить, мы и поговорим в этой статье.
Для того чтобы наша текущая сессия работы в терминале не потерялась из-за разрыва соединения, можно запустить терминал в так называемом "скрине" - это по сути обычный терминал, от которого можно отключиться, но при этом он продолжит работать. И так же в любой момент к нему можно подключиться и увидеть актуальное состояние происходящих процессов в этом терминале. Для этого используется утилита screen, доступная во всех современных линуксах.
Давайте подключимся по ssh к нашему серваку. После подключения сразу создадим новый скрин:
screen -R blablabla
где blablabla - это имя нашего создаваемого скрина.
После этого мы оказываемся в новом терминале без какой-либо истории. Давайте выполним теперь в этом терминале какую-нибудь команду. К примеру:
echo 123
После чего можно попробовать отключиться от терминала. Для этого нужно сначала нажать сочетание клавиш CRTL + A, а затем нажать клавишу D.
В терминале, из которого мы запускали скрин, мы увидим уведомление о том, что мы отключились от скрина:
Теперь давайте снова подключимся к этому скрину. Для этого воспользуемся той же командой:
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
Всё, теперь никакие разрывы соединений нам не страшны. Всем успешных миграций ;)
Комментарии