Команда nohup в Linux: как запустить фоновый скрипт без закрытия при выходе
Почему программы закрываются при отключении от SSH?
Когда вы подключаетесь к серверу по SSH, операционная система привязывает все запущенные вами команды к текущей сессии терминала. Как только вы закрываете вкладку PuTTY/терминала, пропадает интернет или завершается сессия, ядро Linux отправляет всем вашим запущенным программам сигнал SIGHUP (Signal Hang UP — обрыв связи), и процесс немедленно завершает свою работу.
| Режим запуска | Реакция на закрытие окна терминала | Куда пишется вывод программы |
|---|---|---|
python3 bot.py (Обычный) | Процесс мгновенно аварийно завершается | Прямо в окно текущего терминала |
python3 bot.py & (Фоновый) | Процесс завершается при получении SIGHUP | В окно терминала (мешает вводу команд) |
nohup ./bot.sh & (Nohup) | Продолжает непрерывно работать | В отдельный файл лога (nohup.out) |
Инструкция по использованию утилиты nohup
Утилита nohup (No Hang Up) перехватывает сигнал отключения сессии и указывает ядру операционной системы продолжать выполнение процесса даже после полного отключения пользователя.
- Шаг 1. Делаем файл скрипта исполняемым (если запускается .sh файл):
chmod +x /path/to/start_bot.sh - Шаг 2. Запуск программы через nohup в фоновом режиме:
Символ
&в самом конце команды обязателен — он отправляет задачу в фоновый режим, освобождая командную строку для дальнейшей работы:nohup ./start_bot.sh & - Шаг 3. Перенаправление логов в собственный файл:
По умолчанию nohup пишет все логи в файл
nohup.out. Чтобы направить вывод в свой файл лога и отделить ошибки, используйте перенаправление потоков:nohup python3 -u /home/user/bot.py > /home/user/bot.log 2>&1 & - Шаг 4. Проверяем, что процесс успешно запущен и работает:
Убедимся в наличии запущенного процесса через фильтрацию списка задач:
ps aux | grep bot.py - Шаг 5. Как остановить процесс, запущенный через nohup:
Найдите идентификатор процесса (PID — число во второй колонке вывода
ps) и завершите его:kill 12345
Частые вопросы (FAQ)
Что означает конструкция 2>&1 в команде?
В Linux поток 1 — это стандартный вывод (обычные сообщения), а поток 2 — поток ошибок (stderr). Конструкция 2>&1 перенаправляет все системные ошибки в тот же файл лога, куда пишутся обычные сообщения.
Почему Python-скрипт под nohup не сразу пишет строки в файл лога?
Python буферизирует вывод в файл. Чтобы сообщения появлялись в логе мгновенно в реальном времени, запускайте Python с ключом -u (unbuffered): nohup python3 -u script.py &.
Чем nohup отличается от утилит screen и tmux?
Nohup просто отвязывает процесс от терминала и пишет вывод в файл. Утилиты screen и tmux создают полноценную виртуальную сессию, к которой можно повторно подключиться и увидеть интерактивный экран программы.
Запустится ли процесс заново, если перезагрузить весь сервер?
Нет. Nohup защищает только от закрытия окна терминала. Для автозапуска программы после перезагрузки сервера необходимо оформить ее как службу systemd (Systemd Service).