Что такое демон в Linux — и почему твой бот умирает, когда ты закрываешь ноутбук

Ты написал Telegram-бота. Залил его на сервер, зашёл по SSH, запустил python bot.py. Бот отвечает. Красота.
Закрываешь ноутбук, идёшь спать. Утром пишешь боту — тишина. Заходишь на сервер: процесса нет. Ни ошибки, ни следа.
Бот не упал. Его убили вместе с твоим окном терминала. Он жил внутри твоей сессии, и сессия забрала его с собой. Чтобы программа жила сама по себе, она должна стать демоном.
Что такое демон
Демон — это программа, которая работает в фоне и ни к какому терминалу не привязана. Её никто не запускал руками. Она стартует вместе с системой и ждёт: запроса, письма, нужного часа.
Ты уже пользуешься десятками демонов, просто не видишь их. Вот несколько:
sshd— ждёт, когда ты подключишься по SSH;cron— каждую минуту проверяет, не пора ли что-то запустить;nginx— отдаёт сайт, пока ты спишь;dockerd— управляет контейнерами.
Заметил букву d на конце? Это от daemon. Традиция Unix: по имени сразу видно, что программа фоновая.
А слово — не про нечисть. В начале 60-х программисты из MIT взяли его у физиков. Там был «демон Максвелла» — воображаемое существо, которое незаметно сортирует молекулы. Тихий помощник, который делает работу, пока его не видно. Ровно так и ведёт себя демон в системе.
Почему обычная программа умирает с терминалом
Когда ты запускаешь python bot.py, процесс становится ребёнком твоего терминала. Его ввод и вывод привязаны к окну.
Ты закрыл ноутбук — SSH-соединение оборвалось. Система рассылает всем процессам этой сессии сигнал SIGHUP. Буквально «hang up», «повесили трубку». Старый обычай из времён модемов: связь пропала — заканчивай работу.
Большинство программ на SIGHUP просто завершаются. Твой бот в том числе. Поэтому ошибки в логе нет: его не сломали, его вежливо попросили уйти.
У демона этой проблемы нет. У него нет терминала, а значит, нечему вешать трубку. Его родитель — сама система, а не твоё окно.
Как превратить бота в демона
Раньше программы «демонизировались» сами: хитро отцеплялись от терминала, писали свой PID в файл. Сегодня так почти никто не делает. На современном Linux этим занимается systemd — главный демон, который запускает все остальные.
Тебе нужен один маленький файл. Создай /etc/systemd/system/bot.service:
[Unit]
Description=Telegram bot
After=network-online.target
[Service]
WorkingDirectory=/home/me/bot
ExecStart=/home/me/bot/.venv/bin/python bot.py
Restart=always
User=me
[Install]
WantedBy=multi-user.target
Пять строк, которые стоит понять:
ExecStart— что запускать. Пиши полный путь к python. У systemd нет твоего PATH и активированного venv.WorkingDirectory— где программа будет искать свои файлы.Restart=always— упал бот, systemd поднимет его снова.User=me— от чьего имени работать. Не от root, если можно.WantedBy=multi-user.target— запускать при загрузке сервера.
Теперь включи службу:
sudo systemctl daemon-reload
sudo systemctl enable --now bot
enable — запускать при старте системы. --now — и прямо сейчас тоже. Закрывай ноутбук: бот останется.
Как следить за демоном
У демона нет окна, куда печатать. Куда же делись его print? Их собирает systemd в общий журнал.
systemctl status bot # жив ли, когда стартовал, последние строки
journalctl -u bot -f # лог в реальном времени
sudo systemctl restart bot # перезапуск после правки кода
Вот это главная привычка. Бот молчит — первым делом systemctl status. Там видно, жив ли он, сколько раз перезапускался и что написал перед смертью. Про чтение журнала подробно — в статье про логи в реальном времени.
Одна ловушка. С Restart=always сломанный бот будет падать и вставать по кругу. Со стороны кажется, что всё работает. Если в status видишь растущий счётчик рестартов — читай журнал, а не жди.
Где ты встретишь демонов
- Деплой на свой сервер. Бот, API, воркер очереди — всё это нужно оформлять службой.
- Docker. Внутри контейнера systemd обычно нет. Там «демоном» работает сам контейнер, а перезапуском занимается
restart: alwaysв compose. - Агенты. Claude Code или Codex, запущенные на сервере в обычной сессии, умрут так же, как бот. Для долгой работы их держат в tmux или оформляют службой.
- Собеседования и доки. Фразы «запусти как демон», «daemon mode», флаг
-dуdocker run— всё про одно: работать в фоне без терминала.
Демон и процесс в фоне через & — одно и то же?
Нет. python bot.py & уводит программу в фон, но она всё ещё ребёнок твоего терминала. Закроешь SSH — получит SIGHUP и умрёт. Демон от терминала отвязан полностью.
А nohup не проще?
nohup python bot.py & переживёт закрытие терминала — для быстрой проверки сойдёт. Но после перезагрузки сервера или падения бот не поднимется. systemd делает и то и другое, поэтому для всего, что должно жить неделями, бери службу.
Демон — это вирус?
Нет, обычная системная программа. Сотни таких работают на любом компьютере, включая твой: на Mac их запускает launchd, на Windows похожие штуки называются службами.
Короткие уроки-истории, симулятор агента и ежедневная практика — в нашем мобильном приложении. Бесплатно.





