Фоновый режим в Linux: запуск скрипта через nohup и &, защита от закрытия SSH
Почему скрипт обрывается при закрытии SSH-клиента?
Когда вы подключаетесь к серверу по SSH и запускаете длинный скрипт (бэкап, парсинг данных, обучение нейросети или перенос файлов), процесс привязывается к текущей терминальной сессии. Как только вы закрываете окно терминала, ноутбук уходит в спящий режим или обрывается интернет, операционная система автоматически отправляет всем дочерним процессам сигнал SIGHUP (Signal Hang Up), который мгновенно убивает запущенную программу.
Сравнение способов фонового запуска:
| Способ | Сложность | Защита от обрыва SSH | Возможность вернуться в консоль |
|---|---|---|---|
Символ & в конце | Очень легко | Нет (при закрытии SSH процесс может упасть) | Нет |
| nohup + & | Легко | 100% защита от закрытия консоли | Вывод пишется в nohup.out |
| Утилита screen / tmux | Средне | 100% защита | Полный интерактивный возврат к экрану |
3 способа запуска программ в фоновом режиме
1. Стандартный надежный способ: утилита nohup
Команда
nohup(No Hang Up) игнорирует сигнал обрыва связи, а символ&отправляет задачу выполняться в фоновый поток:nohup ./long_script.sh > output.log 2>&1 &Разбор команды:
•nohup— защищает процесс от закрытия сессии.
•> output.log 2>&1— перенаправляет весь обычный вывод и ошибки в текстовый файлoutput.log.
•&— освобождает командную строку для дальнейшей работы.Теперь вы можете спокойно закрывать терминал — скрипт продолжит работу на сервере.
2. Если скрипт уже запущен в терминале прямо сейчас
Если вы запустили тяжелую команду и поняли, что не можете закрыть консоль:
- Нажмите сочетание Ctrl + Z (это приостановит выполнение задачи).
- Введите команду
bgи нажмите Enter (переведет задачу в фоновый режим). - Введите команду
disown -h(отвяжет процесс от текущего окна SSH).
3. Использование виртуального терминала Screen (Интерактивно)
# Устанавливаем и запускаем новую виртуальную сессию: sudo apt install screen -y screen -S my_backup # Запускаем скрипт внутри screen: ./long_script.shЧтобы отключиться от сессии, оставив ее работать: нажмите Ctrl + A, затем клавишу D (Detach).
Чтобы вернуться обратно к процессу позже: введитеscreen -r my_backup.
Частые вопросы (FAQ)
Как найти и остановить процесс, запущенный через nohup?
Найдите его номер PID через команду ps aux | grep long_script.sh и завершите: sudo kill <PID>.
Что такое файл nohup.out?
Если при запуске через nohup вы не указали файл для сохранения вывода, утилита автоматически запишет все логи программы в файл nohup.out в текущей папке.
Как посмотреть список всех фоновых задач текущей сессии?
Выполните команду jobs. Она покажет номера запущенных в фоне задач.
Чем tmux лучше screen?
tmux — это более современный и гибкий аналог screen с поддержкой разделения экрана на панели, удобным статус-баром и широкими возможностями кастомизации.