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

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

Хм. Не велика разница. Но она все же есть.

Роман Шубин
Роман Шубин
CEO & CTO, Главред в «Цифровой улей»
Задать вопрос
Команда setsid более прямой способ создания нового сеанса, тогда как nohup просто игнорирует сигнал SIGHUP.

Изучай.