- Home »

Запуск скриптов в фоне: nohup, wait, sleep
Если ты когда-нибудь пробовал запускать скрипты на сервере и сталкивался с тем, что консоль закрылась — а процесс вместе с ней исчез, то ты точно знаешь, насколько это может быть раздражающим. Особенно если речь идёт о долгих задачах: бэкапах, парсерах, миграциях или каких-нибудь кастомных сервисах. В этой статье разберёмся, как запускать скрипты в фоне, чтобы они не зависели от твоего SSH-соединения, не вылетали при выходе из сессии, а ты мог спокойно заниматься своими делами или даже перезагружать терминал. Поговорим про nohup, wait и sleep — три простых, но чертовски полезных инструмента, которые реально экономят нервы и время на любом сервере — от VPS до жирного “деда”.
О чём эта статья и зачем тебе это знать?
Здесь ты найдёшь:
- Объяснение — как работают
nohup
,wait
иsleep
; - Как их использовать для запуска фоновых задач;
- Реальные сценарии и кейсы — что делать, а что лучше не делать;
- Ошибки и мифы, которые мешают новичкам;
- Пару лайфхаков, чтобы автоматизировать рутину;
- Сравнение с другими инструментами и когда стоит перейти на что-то посерьёзнее.
Почему запуск в фоне — это важно?
На сервере всё крутится вокруг задач, которые должны работать независимо от того, открыт ли твой терминал. Например:
- Долгие бэкапы баз данных или файлов;
- Парсеры, которые обрабатывают гигабайты данных;
- Скрипты обновления или миграции;
- Мониторинг или автоматизация (cron, CI/CD и так далее);
- Развёртывание docker-контейнеров и сервисов.
Если ты запускаешь что-то через SSH, а потом случайно теряешь соединение — стандартный процесс завершается, иногда оставляя после себя “зомби”. Вот тут и приходят на помощь наши герои.
Как это работает? Алгоритмы и структура
Давай по порядку разберём три инструмента:
nohup: запускаем скрипт и забываем
nohup
(от “no hang up”) — команда, которая позволяет запускать процессы, чтобы они не завершились при закрытии терминала или разрыве SSH. Она перенаправляет стандартные потоки ввода/вывода, чтобы процесс не зависел от сессии.
nohup ./myscript.sh &
Здесь &
отправляет процесс в фоновый режим, а nohup
гарантирует, что он не умрёт при выходе из сессии.
Особенности:
- Стандартный вывод записывается в
nohup.out
, если не указать файл; - Процесс можно найти через
ps aux | grep myscript
; - Работает для любой команды или скрипта.
wait: ждём завершения процессов
wait
— встроенная команда bash, которая заставляет скрипт ждать завершения всех запущенных в фоне процессов. Это удобно, когда нужно запустить несколько задач параллельно, а потом продолжить выполнение только после их окончания.
#!/bin/bash
long_task_1 &
long_task_2 &
wait
echo "Обе задачи завершены!"
Такой паттерн часто используют для параллельной обработки данных, когда не хочется плодить миллионы скриптов или зависеть от сторонних тулзов.
sleep: делаем паузы между действиями
sleep
— простейшая команда для задержки выполнения. Можно использовать для throttling (чтобы не перегружать сервер или API) или для периодического запуска чего-либо.
sleep 10
Это заставит скрипт подождать 10 секунд. Можно использовать в цикле для имитации cron или простого таймера.
Как быстро и просто всё настроить?
Вот базовые сценарии, которые реально работают в проде.
1. Запуск скрипта в фоне и отсоединение от терминала
nohup ./backup.sh &
Скрипт продолжит работать даже после закрытия SSH. Лог можно посмотреть в nohup.out
или перенаправить так:
nohup ./backup.sh > backup.log 2>&1 &
2. Запуск нескольких задач параллельно и ожидание завершения
#!/bin/bash
./task1.sh &
./task2.sh &
./task3.sh &
wait
echo "Все задачи завершены!"
3. Периодический запуск с помощью sleep
while true
do
./parse.sh
sleep 300 # 5 минут
done
Такой паттерн можно использовать, если не хочется возиться с cron или нужно гибко управлять задержками.
4. Комбинируем всё вместе
nohup bash -c '
./long1.sh &
./long2.sh &
wait
echo "Готово!"
' > long.log 2>&1 &
Это позволит запустить несколько задач в фоне и быть уверенным, что они доработают до конца.
Примеры и кейсы использования
Сценарий | Решение | Плюсы | Минусы |
---|---|---|---|
Долгий бэкап базы | nohup pg_dumpall > dump.sql & |
Не зависит от SSH, легко отследить | Лог по умолчанию в nohup.out |
Параллельная обработка файлов |
|
Много задач одновременно, ускорение | Можно перегрузить сервер |
Пауза между запросами к API |
|
Не блокирует API, нет rate-limit | Время выполнения увеличивается |
Ошибки новичков и мифы
- Миф:
nohup
— это только для bash.
Факт: Работает для любого процесса — хоть для python, хоть для docker, хоть для nodejs. - Ошибка: Забывают про
&
— процесс не уходит в фон, а терминал “зависает”. - Ошибка: Не перенаправляют вывод — потом ищут логи по всему серверу.
- Ошибка: Думают, что
wait
ждёт любой процесс — он ждёт только те, что запущены в рамках текущего скрипта. - Миф:
sleep
— это костыль, а не инструмент.
Факт: В автоматизации это must-have, особенно для throttle и тайминга. - Ошибка: Запускают слишком много фоновых процессов — сервер уходит в swap или падает loadavg.
Сравнение с другими решениями
Инструмент | Плюсы | Минусы |
---|---|---|
nohup | Просто, всегда под рукой, не требует root | Нет управления процессом после запуска |
screen/tmux | Можно переподключаться, смотреть вывод в реальном времени | Нужно помнить команды, иногда не установлен |
systemd | Мониторинг, автозапуск, перезапуск при падении | Сложнее конфигурировать, нужен root |
cron | Планирование, автоматизация | Не подходит для долгих/одноразовых задач |
Docker | Изоляция, масштабируемость | Сложнее для простых задач, требует docker |
Когда стоит использовать что-то “тяжёлое”?
- Для сервисов, которые должны рестартиться при падении — systemd или supervisor
- Для сложных пайплайнов — Airflow, Jenkins, GitLab CI
- Для контейнеров — docker-compose или Kubernetes
Но для большинства задач на VPS или выделенном сервере nohup
, wait
и sleep
— это быстро, просто и надёжно.
Интересные факты и нестандартные способы использования
- Можно запускать через
at
илиcron
с помощьюnohup
, чтобы гарантировать независимость от сессии. - В связке с
inotifywait
(https://github.com/inotify-tools/inotify-tools) можно делать реакцию на события файловой системы и запускать обработку в фоне. - В docker контейнерах
sleep infinity
часто используют для “вечных” контейнеров, которые не должны завершаться. - В скриптах можно использовать
wait $PID
, чтобы дождаться завершения конкретного процесса, а не всех сразу. - Если нужно убить все процессы, запущенные скриптом, можно использовать
trap
для ловли SIGINT/SIGTERM.
Какие новые возможности открываются?
Использование этих команд в автоматизации открывает массу сценариев:
- Ты можешь строить сложные пайплайны без внешних тулзов;
- Параллельная обработка больших объёмов данных без нагрузок на сервер;
- Гибкое управление задержками и таймингом;
- Надёжные бэкапы и миграции, которые не зависят от твоего подключения;
- Лёгкая интеграция с cron, systemd, docker и CI/CD.
Вывод и рекомендации
Запуск скриптов в фоне — это не только про удобство, но и про надёжность. nohup
, wait
и sleep
— это три кита, на которых держится простая автоматизация на любом сервере. Они не требуют установки, работают везде, не зависят от root-доступа и позволяют быстро решать задачи любой сложности.
Если тебе нужен VPS или выделенный сервер, чтобы всё это опробовать на практике — вот ссылки:
Не забывай:
- Используй
nohup
для долгих задач, чтобы не зависеть от SSH; - Комбинируй
wait
и&
для параллельных запусков; - Добавляй
sleep
для контроля нагрузки и тайминга; - Для сложных сценариев — смотри в сторону systemd, docker и supervisor.
Официальные ресурсы для углубления:
Пробуй, автоматизируй, экономь своё время и нервы. Если есть вопросы или кейсы — делись в комментах, всегда рад обсудить и помочь!
В этой статье собрана информация и материалы из различных интернет-источников. Мы признаем и ценим работу всех оригинальных авторов, издателей и веб-сайтов. Несмотря на то, что были приложены все усилия для надлежащего указания исходного материала, любая непреднамеренная оплошность или упущение не являются нарушением авторских прав. Все упомянутые товарные знаки, логотипы и изображения являются собственностью соответствующих владельцев. Если вы считаете, что какой-либо контент, использованный в этой статье, нарушает ваши авторские права, немедленно свяжитесь с нами для рассмотрения и принятия оперативных мер.
Данная статья предназначена исключительно для ознакомительных и образовательных целей и не ущемляет права правообладателей. Если какой-либо материал, защищенный авторским правом, был использован без должного упоминания или с нарушением законов об авторском праве, это непреднамеренно, и мы исправим это незамедлительно после уведомления. Обратите внимание, что переиздание, распространение или воспроизведение части или всего содержимого в любой форме запрещено без письменного разрешения автора и владельца веб-сайта. Для получения разрешений или дополнительных запросов, пожалуйста, свяжитесь с нами.
Обсуждения
довольно удобно, когда пропадает связь и все что ты запускал в терминале “пропадает”. отдыхаю на островах, поэтому инет не стабильный. nohup ))