Без скрипта не выловишь и рыбку из пруда



你好! Познакомился вчера на созвоне с китайцем, зовут его что-то вроде АнХуй. Смешной персонаж. Что-то мне 40 минут втирал на сломанном английском. Я ни слова не понял, но уверено махал головой как обезьяна на бананы. 🅰️



По итогу встречи я выучил слова «Нихао» и «Херанука», а он всяко выучил — «ты, заебал» и «пиздец». Вот так и работаем. Айти объединяет.



Ну чо, поехали двигать пингвинов



Сегодня изучаем — setsid



Эта такая штука… короче с помощью нее можно запускать команды и скрипты в новых сеансах и группах процессов. Скрипт запущенный через setsid будет независим от родительского процесса.



Это гарантирует, что если родительский процесс получит сигнал SIGHUP, то запущенный скрипт через setsid продолжит работу. Nohup? Почти.. Поехали в практику.



Пишем башник bashdays.sh



#!/bin/bash



echo "Starting..."

sleep 200

echo "Finished..."




✔️ Скрипт будет нихуя не делать 200 секунд.



Запускаем:



setsid ./bashdays.sh




Сразу видим, что оболочка продолжила работать в интерактивном режиме. Можно вводить команды и продолжать работу. А что со скриптом bashdays.sh? Давай запустим pstree и визуально глянем.



Это скрипт запущен через setsid



 ├─sshd─bash

├─sshd─bash─pstree

└─sshd─sshd

├─bashdays.sh─sleep




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



А это скрипт bashdays.sh запущен напрямую, без setsid



├─sshd─bash

├─sshd─bash─bashdays.sh─sleep




Видим цепочку, скрипт работает в текущей оболочке bash. Если закрыть оболочку, то и скрипт прекратит свою работу.



Давай сравним setsid и nohup



Если запустить так:



nohup ./bashdays.sh &




Наблюдаем такую картину:



├─sshd─┬─sshd─bash─pstree

├─sshd─bash─bashdays.sh─sleep




Пишем exit и видим уже такое:



├─sshd─sshd─bash─pstree

├─bashdays.sh─sleep




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



Теперь запускаем setsid ./bashdays.sh



├─sshd─┬─sshd───bash───pstree

└─sshd───bash

├─bashdays.sh─sleep




А тут сразу процесс отделился от оболочки и стал корневым. Даже если написать exit и закрыть терминал, sleep продолжит работу.



Хм. Не велика разница. Но она все же есть. Команда setsid более прямой способ создания нового сеанса, тогда как nohup просто игнорирует сигнал SIGHUP.



Изучай.



tags: #bash #linux



@BАSHDАYS | BАSHDАYS.CОM