🔐 Nohup через SSH |

🔐 Nohup через SSH

Мануал

Все запущенные процессы Linux завершаются при выходе из шелла.

Если мы хотим, чтобы эти процессы продолжали работать, несмотря на выход из терминала, мы воспользуемся утилитой командной строки nohup.

Префикс команды с nohup предотвращает ее автоматическое прерывание.

🐧 Как следить за каталогом на предмет создания новых файлов в Linux

В этом руководстве мы узнаем, как использовать nohup через ssh.

Запуск удаленной команды через SSH

SSH расшифровывается как Secure Shell.

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

SSH аутентифицирует обе стороны, используя модель клиент-сервер, и передает команды и вывод от источника к получателю и наоборот.

Данные между ними шифруются.

Синтаксис:

ssh -p <PortNumber> username@host 'command1 && command2'

Хост может быть либо доменным именем, либо IP-адресом.

Номер порта по умолчанию – 22

Давайте попробуем выполнить этот пример:

ssh ubuntu@ip-address-or-servername 'pwd && date'

Убедитесь, что имя пользователя и имя хоста указаны в соответствии с вашей средой.

После установления соединения с удаленной машиной инструкции или команды, переданные вместе с командой SSH, будут работать так, как если бы они предназначались непосредственно для терминала этого хоста.

Однако, как только это SSH-соединение будет закрыто, выполняемые команды будут уничтожены.

Когда мы используем SSH, его демон выделяет нам терминал.

Когда этот демон обнаруживает, что наше соединение мертво, он выдает сигнал SIGHUP на терминал, сообщая, что соединение мертво.

Затем он начнет выдавать сигнал SIGHUP запущенным процессам, связанным с ним, прежде чем завершить работу.

Все эти процессы завершатся после получения этого сигнала.

Как сохранить процессы, запущенные после выхода SSH в Linux

Мы безопасно подключаемся к серверу с помощью команды ssh, чтобы выполнить несколько команд на удаленной машине.

По умолчанию используется порт 22.

После подключения мы выполняем команду pwd на этом сервере, чтобы получить текущий рабочий каталог, а также команду date.

Nohup через SSH

Фоновый процесс – это процесс, который начинает выполняться из терминала и работает в фоновом режиме.

Он не имеет никакого взаимодействия с пользователем.

Этот процесс запускается независимо от оболочки.

Мы можем использовать команду nohup, чтобы заставить скрипт или команду работать в фоновом режиме.

Nohup расшифровывается как No Hang Up.

Она позволяет запускать процессы даже после выхода из оболочки.

Это достигается за счет перехвата и блокировки процессов от получения сигнала SIGHUP (Signal Hang Up).

Этот сигнал посылается процессу при выходе из терминала.

Вот пример:

nohup ./loopRange2.sh &

Символ амперсанда (&) ставится в конце команды, которую мы хотим запустить в фоновом режиме.

После завершения выполнения процесса, запущенного в фоновом режиме, он не возвращается в терминал.

Его можно сделать доступным на переднем плане с помощью команды fg.

С помощью этой команды мы запускаем скрипт в фоновом режиме.

На экране появятся числа.

Первое число, заключенное в квадратные скобки, соответствует идентификатору задания, а следующее – идентификатору процесса.

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

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

Пример:

Предположим, у нас есть скрипт snooze.sh с командой sleep длительностью 1000 секунд.

echo "Hi"
sleep 1000

Попробуем выполнить этот скрипт удаленно с помощью однострочной команды SSH:

ssh ubuntu@ip-address-or-servername "nohup ./snooze.sh &"

Как мы видим, скрипт выполняется, но ssh-соединение остается открытым до тех пор, пока он не заснет на тысячу секунд.

Для удаленного запуска и немедленного возвращения нам нужно убедиться, что вход и выход не открыты.

SSH с помощью nohup будет выглядеть следующим образом:

ssh -n ubuntu@ip-address-or-servername "nohup ./snooze.sh > /dev/null 2>&1 &"

Эта команда выполняет скрипт “snooze” на удаленной системе.

Даже после завершения команды ssh скрипт snooze продолжает выполняться в фоновом режиме.

В следующем разделе мы узнаем, как проверить, что скрипт выполняется, несмотря на завершение сеанса.

Мы можем использовать ssh с дополнительной опцией -n, чтобы предотвратить чтение из stdin.

В нашем случае, даже без флага -n, управление мгновенно вернется в терминал.

Вот еще один пример:

nohup scp somefile ubuntu@ip-address-or-servername:/home/ubuntu/Downloads> /dev/null 2>&1 &

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

Мы выполняем безопасное копирование (SCP) для передачи файла на эту систему.

🐧 SCP vs RSYNC – что из них использовать в продакшене?

Перенаправление 2>&1 перемещает стандартную ошибку туда, куда перенаправляется и стандартный вывод.

Если нам нужны журналы консоли, мы можем перенаправить их в файл.

В данном случае мы отправляем их в специальный файл с именем ‘/dev/null’.

Этот файл считается “черной дырой”.

♾️ Что такое /dev/null в Linux?

В этот файл можно отправить все, что угодно, и ничего из него нельзя извлечь.

Мы также можем отказаться от задания, чтобы оно было отделено от сеанса оболочки.

Мы можем получить соответствующий идентификатор задания, используя команду jobs с опцией -l.

Как только задание будет идентифицировано, мы можем от него отказаться.

jobs -l
disown %1
Команда Linux disown используется для удаления заданий из таблицы.
Она также указывает оболочке не посылать сигнал HUP активным заданиям.
Эта команда полезна для удаления заданий или продолжения их выполнения даже после выхода из ssl-сессии.

Проверка статуса

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

Вот пример:

ps -ef
Это позволит получить подробный список всех процессов в этой системе.
Мы можем отфильтровать результаты, используя утилиту Bash grep, а также трубу Linux следующим образом:
ps -ef | grep <PID>

Команда ps – это удобный инструмент, который выводит список всех запущенных процессов с указанием их PID (идентификаторов процессов) и PPID (идентификаторов родительских процессов).

Флаг -e, означающий “весь”, отображает все процессы в системе, а не только ограниченные текущим терминалом.

Опция -f дает подробное представление о процессах.

Как проверить статус скрипта, запущенного в фоновом режиме с помощью Nohup?

Мы можем получить PID, записав его в файл в начале нашего shell-скрипта.

Как только у нас будет файл с PID, мы можем просто искать этот PID, чтобы узнать, закончил ли процесс выполняться или нет.

Чтобы записать PID, мы можем добавить в наш скрипт следующее:

echo $$ > processIDFile.pid

Получив PID фонового процесса, мы можем остановить его, указав этот PID команде kill.

kill -9 <PID>

Как проверить статус удаленного скрипта, запущенного в фоновом режиме с помощью Nohup?

Собрав все это вместе, мы можем теперь подключиться к удаленному серверу по SSH, как мы делали ранее, и выполнить эти команды.

ssh ubuntu@ip-address-or-servername 'nohup ./top.sh &'
ssh ubuntu@ip-address-or-servername 'cat PID.pid'
ssh ubuntu@ip-address-or-servername 'ps -ef | grep <PID>'
ssh ubuntu@ip-address-or-servername 'kill -9 <PID>'
ssh ubuntu@ip-address-or-servername 'ps -ef | grep <PID>'
Мы перечисляем PID фонового процесса.
Если это скрипт, мы можем добавить PID в какой-нибудь файл и прочитать его.
Получив файл, мы завершаем скрипт или процесс, соответствующий этому PID, с помощью команды kill.

Заключение

  • SSH устанавливает безопасное соединение с удаленным сервером.
  • Команда nohup позволяет нам сохранить процесс/скрипт/команду запущенной, несмотря на выход из терминала, перехватив команду SIGHUP.
  • Команда ps с ее флагами может быть использована для определения статуса и завершения фонового процесса.
см. также:

Пожалуйста, не спамьте и никого не оскорбляйте. Это поле для комментариев, а не спамбокс. Рекламные ссылки не индексируются!
Добавить комментарий