Как добавить скрипт или программу в автозагрузку Linux через Systemd
Зачем использовать Systemd вместо rc.local или cron @reboot?
Запуск фоновых скриптов через cron не гарантирует их работу при падении. Systemd — это современный стандарт управления процессами в Linux, который:
- Автоматически запускает службу при загрузке сервера после поднятия сети.
- Сам перезапускает скрипт при непредвиденных ошибках и сбоях.
- Ведет подробные системные журналы выполнения (через
journalctl). - Позволяет ограничить потребление памяти и прав учетной записи.
Создание собственного сервиса .service
- Создайте новый unit-файл службы в каталоге systemd:
sudo nano /etc/systemd/system/myscript.service - Вставьте следующую стандартную конфигурацию (на примере Python-скрипта или Node.js):
[Unit] Description=Мой пользовательский фоновый сервис After=network.target [Service] Type=simple User=ubuntu WorkingDirectory=/home/ubuntu/myapp ExecStart=/usr/bin/python3 /home/ubuntu/myapp/main.py Restart=always RestartSec=5 StandardOutput=journal StandardError=journal [Install] WantedBy=multi-user.target - Перечитайте конфигурацию системных служб:
sudo systemctl daemon-reload - Включите автозапуск службы при старте системы и запустите ее прямо сейчас:
sudo systemctl enable --now myscript.service - Проверьте текущий статус работы:
sudo systemctl status myscript.service
Совет: Всегда указывайте полные абсолютные пути к исполняемым файлам (например, /usr/bin/python3 вместо просто python3). Узнать точный путь можно командой which python3 или which bash.
Частые вопросы (FAQ)
Как посмотреть логи работы созданного скрипта?
Используйте утилиту journalctl: journalctl -u myscript.service -f (флаг -f транслирует новые записи в реальном времени).
Что делает параметр RestartSec=5?
Если ваш скрипт аварийно завершится (упадет), systemd подождет ровно 5 секунд и автоматически запустит его заново.
Зачем указывать параметр User?
Запуск скриптов от обычного пользователя (например, User=ubuntu или User=www-data) предотвращает захват всего сервера злоумышленниками в случае уязвимости в коде вашего скрипта.
Как удалить службу из системы навсегда?
Выполните sudo systemctl disable --now myscript.service, затем удалите файл sudo rm /etc/systemd/system/myscript.service и выполните sudo systemctl daemon-reload.