75 lines
		
	
	
		
			4.5 KiB
		
	
	
	
		
			Markdown
		
	
	
			
		
		
	
	
			75 lines
		
	
	
		
			4.5 KiB
		
	
	
	
		
			Markdown
		
	
	
| ---
 | ||
| title: Отвязка процесса от терминальной сессии
 | ||
| description: 
 | ||
| published: true
 | ||
| date: 2023-11-07T18:15:16.344Z
 | ||
| tags: bash, process, screen
 | ||
| editor: markdown
 | ||
| dateCreated: 2023-11-07T10:15:03.139Z
 | ||
| ---
 | ||
| 
 | ||
| Есть у меня какой-то долгоиграющий скрипт, который я по дурости запустил в терминале, без nohup и применения screen. Ждать завершения скрипта не вариант, но и завершать его принудительно нельзя. Как быть? Сейчас покажу, поехали.
 | ||
| 
 | ||
| Сделаем подопытный образец, который в цикле будет писать в файл числа от 1 до 10000, чтобы визуально понимать что происходит. Ну и паузу впендюрим 2 секунды, для чистоты эксперимента.
 | ||
| 
 | ||
| ```bash
 | ||
| #!/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 и ловишь флешбек. |