wiki-js/sysadmin/bash/process-forward.html

44 lines
4.8 KiB
HTML
Raw Blame History

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

<!--
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>