From f0fd2abbe756a652028d1b55a31f8b8704c6a3d7 Mon Sep 17 00:00:00 2001 From: Administrator Date: Tue, 7 Nov 2023 10:27:32 +0000 Subject: [PATCH] docs: update sysadmin/bash/process-forward --- sysadmin/bash/process-forward.md | 75 ++++++++++++++++++++++++++++++++ 1 file changed, 75 insertions(+) create mode 100644 sysadmin/bash/process-forward.md diff --git a/sysadmin/bash/process-forward.md b/sysadmin/bash/process-forward.md new file mode 100644 index 0000000..ee4fa27 --- /dev/null +++ b/sysadmin/bash/process-forward.md @@ -0,0 +1,75 @@ +--- +title: Отвязка процесса от терминальной сессии +description: +published: true +date: 2023-11-07T10:27:32.147Z +tags: bash, process, screen +editor: markdown +dateCreated: 2023-11-07T10:15:03.139Z +--- + +Есть у меня какой-то долгоиграющий скрипт, который я по дурости запустил в терминале, без nohup и применения screen. Ждать завершения скрипта не вариант, но и завершать его принудительно нельзя. Как быть? Сейчас покажу, поехали. + +Сделаем подопытный образец, который в цикле будет писать в файл числа от 1 до 10000, чтобы визуально понимать что происходит. Ну и паузу впендюрим 2 секунды, для чистоты эксперимента. + +```plaintext +#!/bin/bash + +for i in {1..10000} +do +echo $i >> /tmp/log.txt +sleep 2 +done +``` + +Запускаем, ага. Теперь открываем второй терминал и пишем: + +```plaintext +tail -f /tmp/log.txt +``` + +Видим как файл log.txt постепенно наполняется циферками.   + +Всё прекрасно. Что нужно сделать дальше. А дальше жми сочетание клавиш ctrl+z в первом терминале, где ты запустил скрипт. + +Комбинация клавиш Ctrl + Z посылает процессу сигнал, который приказывает ему остановиться. Это значит, что процесс остается в системе, но как бы замораживается. + +Ловим такое: + +```plaintext +[1]+ Stopped ./script.sh +``` + +Видим что скрипт остановил свою работу. А во втором терминале с tail, цифры перестали заполнять файл log.txt. Ключевое слово - остановил, но не прекратил. Окей, мы на верном пути. + +А теперь в первом терминале запускай команду bg, в ответ ты увидишь такое: + +```plaintext +[1] + ./script.sh & +``` + +Видишь в конце закорючку &, наталкивает на мысли? 🤒 + +Команда bg предназначена для возобновления исполнения остановленной задачи в фоновом режиме в командных оболочках. + +Скрипт продолжил работу в фоне, с того момента где ты его приостановил. Идем во второй терминал с tail и видим, что цифры продолжили заполнять файл. + +Круто! Но это пока еще не все, если закрыть первый терминал, скрипт прекратит свою работу, нужно его как-то отвязать от текущей сессии и демонизировать.   + +Запускаем финалочку: + +```plaintext +disown %1 +``` + +Команда disown блокирует отправку системного сигнала SIGHUP с помощью командной оболочки и исполняющемуся в фоновом режиме процессу при завершении работы командной оболочки.   + +Теперь в первом терминале пишем exit либо просто закрываем его нахрен. Ха! А во втором терминале работа скрипта продолжается. Магия! + +Вот таким образом ты можешь легко отвязать уже запущенный скрипт от терминальной сессии и уйти по своим делам, пощелкать впн и т.п. Кстати работает не только со скриптами. + +Наверное есть еще варианты провернуть подобное. Я показал способ которым пользуюсь сам. + +Ключевые слова для самостоятельного гугления: bg, fg, jobs, disown, nohup. + +Да, после того как нажал ctrl+z, можно все откатить назад, запускаешь команду fg и ловишь флешбек. \ No newline at end of file