Без скрипта не выловишь и рыбку из пруда
你好! Познакомился вчера на созвоне с китайцем, зовут его что-то вроде АнХуй. Смешной персонаж. Что-то мне 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.Изучай.








Комментарии