Назад | Перейти на главную страницу

Запускать удаленный скрипт и отслеживать его активность, не поддерживая соединение

Я сам работаю на Linux Mint, у меня есть удаленный VPS-сервер Ubuntu с root-доступом по ssh. у меня есть скрипт на сервере, который делает долгую обработку данных (часы или даже дни обработки).

Теперь я могу открыть консоль на своей машине, подключиться к VPS через ssh и запустить скрипт - я вижу, что скрипт делает в реальном времени в моей консоли (сколько данных обработано, сколько осталось и так далее, регулярно обновляется на экране моей консоли) - это работает.

Как я могу сделать подобное, но без зависимостей моей локальной машины:

  1. Подключиться к серверу и запустить скрипт
  2. Отключился и оставил сервер для выполнения своей долгой работы по обработке, в то время как я могу перезагрузить локальную машину или когда-либо выключить ее, не влияя на выполнение запущенного сценария сервера.
  3. Есть возможность подключиться позже снова и посмотреть, каков текущий статус процесса (те же данные, которые он показал мне в реальном времени), не прерывая процесс.

я так думаю screen это идеальное решение для вас. Как это работает - вы подключаетесь к своему VPS, набираете screen, затем запустите свой сценарий и отсоединитесь от оболочки (либо закройте окно терминала, либо нажмите ctrl+a с последующим ctrl+d)

Ваш скрипт (и оболочка) будут продолжать работать в фоновом режиме. Вы можете просмотреть screen номер, набрав screen -ls. Чтобы восстановить сеанс и увидеть прогресс / результат вашего скрипта, получите номер экрана с помощью screen -ls а затем подключитесь к нему с помощью screen -r <screen number>. И это все. После восстановления вы можете снова отсоединить таким же образом.

Вы можете установить экран на свой VPS с помощью apt-get install screen для дистрибутивов на основе Debian и yum install screen для дистрибутивов на основе RedHat.

Вы также можете запустить сценарий в фоновом режиме и получить доступ к выходным данным, когда они вам понадобятся. Мой тестовый сценарий будет довольно простым:

root@jump:~# cat test.sh
#!/bin/bash
for ((i=0; i<=99999; i+=1)); do
    echo $i
    sleep 1
done

Он просто печатает число в секунду. Чтобы запустить его в фоновом режиме, я буду использовать:

root@jump:~# at now
warning: commands will be executed using /bin/sh
at> /root/test.sh
at> <EOT>

Примечание: EOT выполняется с помощью Control & D. После этого дайте скрипту поработать, отключитесь от сервера. Если вы хотите увидеть результат, подключитесь и найдите PID процесса:

root@jump:~# ps aux | grep test
root      6312  0.0  2.1  18048  2836 ?        SN   13:08   0:00    /bin/bash /root/test.sh

И получите результат. Замените 6312 на PID вашего процесса:

root@jump:~# tail -f /proc/6312/fd/1
137
138
139
140
141
^C

fd / 1 = стандартный вывод, fd / 2 = стандартный поток