docs: create sysadmin/bash/process-forward

main
Федоров Дмитрий 2023-11-07 10:15:09 +00:00 committed by Dmitriy Fedorov
parent 34032105f4
commit 389cea412e
1 changed files with 43 additions and 0 deletions

View File

@ -0,0 +1,43 @@
<!--
title: Отвязка процесса от терминальной сессии
description:
published: true
date: 2023-11-07T10:15:03.139Z
tags: bash, process, screen
editor: ckeditor
dateCreated: 2023-11-07T10:15:03.139Z
-->
<p>Есть у меня какой-то долгоиграющий скрипт, который я по дурости запустил в терминале, без nohup и применения screen. Ждать завершения скрипта не вариант, но и завершать его принудительно нельзя. Как быть? Сейчас покажу, поехали.</p>
<p>Сделаем подопытный образец, который в цикле будет писать в файл числа от 1 до 10000, чтобы визуально понимать что происходит. Ну и паузу впендюрим 2 секунды, для чистоты эксперимента.</p>
<p>&nbsp;</p>
<pre><code class="language-plaintext">#!/bin/bash
for i in {1..10000}
do
echo $i &gt;&gt; /tmp/log.txt
sleep 2
done</code></pre>
<p>&nbsp;</p>
<p>Запускаем, ага. Теперь открываем второй терминал и пишем:</p>
<pre><code class="language-plaintext">tail -f /tmp/log.txt</code></pre>
<p>Видим как файл log.txt постепенно наполняется циферками. &nbsp;</p>
<p>Всё прекрасно. Что нужно сделать дальше. А дальше жми сочетание клавиш ctrl+z в первом терминале, где ты запустил скрипт.</p>
<p>Комбинация клавиш Ctrl + Z посылает процессу сигнал, который приказывает ему остановиться. Это значит, что процесс остается в системе, но как бы замораживается.</p>
<p>Ловим такое:</p>
<pre><code class="language-plaintext">[1]+ Stopped ./script.sh</code></pre>
<p>Видим что скрипт остановил свою работу. А во втором терминале с tail, цифры перестали заполнять файл log.txt. Ключевое слово - остановил, но не прекратил. Окей, мы на верном пути.</p>
<p>А теперь в первом терминале запускай команду bg, в ответ ты увидишь такое:</p>
<pre><code class="language-plaintext">[1] + ./script.sh &amp; </code></pre>
<p>Видишь в конце закорючку &amp;, наталкивает на мысли? 🤒</p>
<p>Команда bg предназначена для возобновления исполнения остановленной задачи в фоновом режиме в командных оболочках.</p>
<p>Скрипт продолжил работу в фоне, с того момента где ты его приостановил. Идем во второй терминал с tail и видим, что цифры продолжили заполнять файл.</p>
<p>Круто! Но это пока еще не все, если закрыть первый терминал, скрипт прекратит свою работу, нужно его как-то отвязать от текущей сессии и демонизировать. &nbsp;</p>
<p>Запускаем финалочку:</p>
<pre><code class="language-plaintext">disown %1</code></pre>
<p>Команда disown блокирует отправку системного сигнала SIGHUP с помощью командной оболочки и исполняющемуся в фоновом режиме процессу при завершении работы командной оболочки. &nbsp;</p>
<p>Теперь в первом терминале пишем exit либо просто закрываем его нахрен. Ха! А во втором терминале работа скрипта продолжается. Магия!</p>
<p>Вот таким образом ты можешь легко отвязать уже запущенный скрипт от терминальной сессии и уйти по своим делам, пощелкать впн и т.п. Кстати работает не только со скриптами.</p>
<p>Наверное есть еще варианты провернуть подобное. Я показал способ которым пользуюсь сам.</p>
<p>Ключевые слова для самостоятельного гугления: bg, fg, jobs, disown, nohup.</p>
<p>Да, после того как нажал ctrl+z, можно все откатить назад, запускаешь команду fg и ловишь флешбек.</p>