Найти в Дзене
UFO.Hosting

Как добавить скрипт в автозагрузку Ubuntu

Довольно часто бывает ситуация, когда вы нашли в интернете полезный готовый скрипт для мониторинга состояния сервера или автоматического обновления. Однако, в инструкции авторы почему-то нередко умалчивают, как добавить эту программу в автозагрузку. В итоге приходится каждый раз при перезапуске сервера включать скрипт вручную Мы решили закрыть этот пробел и подробно рассказать, как добавить скрипт в автозагрузку вашего сервера или рабочего ПК на Ubuntu. 1. В начале файла укажите интерпретатор и сделайте файл исполняемым: #!/usr/bin/env bash # ваш код chmod +x ~/bin/myscript.sh Если скрипт написан на Python, то добавьте следующее: : #!/usr/bin/env python3 2. В автозагрузке переменная PATH и рабочая директория часто отличаются от привычных. Прописывайте полные пути к файлам и программам, а если нужна папка исполнения — задайте её явно. 3. Продумайте вывод логов: перенаправьте stdout/stderr в файл или опирайтесь на журнал systemd. Это сэкономит время на поиске ошибок. Сегодня systemd — э
Оглавление

Довольно часто бывает ситуация, когда вы нашли в интернете полезный готовый скрипт для мониторинга состояния сервера или автоматического обновления. Однако, в инструкции авторы почему-то нередко умалчивают, как добавить эту программу в автозагрузку. В итоге приходится каждый раз при перезапуске сервера включать скрипт вручную

Мы решили закрыть этот пробел и подробно рассказать, как добавить скрипт в автозагрузку вашего сервера или рабочего ПК на Ubuntu.

Сперва пара важных настроек

1. В начале файла укажите интерпретатор и сделайте файл исполняемым:

#!/usr/bin/env bash

# ваш код

chmod +x ~/bin/myscript.sh

Если скрипт написан на Python, то добавьте следующее: :

#!/usr/bin/env python3

2. В автозагрузке переменная PATH и рабочая директория часто отличаются от привычных. Прописывайте полные пути к файлам и программам, а если нужна папка исполнения — задайте её явно.

3. Продумайте вывод логов: перенаправьте stdout/stderr в файл или опирайтесь на журнал systemd. Это сэкономит время на поиске ошибок.

Вариант №1 — systemd

Сегодня systemd — это основной механизм автозапуска в Ubuntu. Он понятный, им легко управлять и предоставляет большой набор настроек.

Вариант A: сервис в пользовательской сессии (без root)

Подходит, когда скрипт не требует привилегий и может работать от имени вашего пользователя. Например, обработчик, который крутится в $HOME.

1. Создайте юнит:

mkdir -p ~/.config/systemd/user

nano ~/.config/systemd/user/myscript.service

Например, у него может быть такое содержание:

[Unit]

Description=My user script

After=default.target

[Service]

Type=simple

ExecStart=/home/username/bin/myscript.sh

WorkingDirectory=/home/username

# Если нужен Python-виртуальное окружение:

# ExecStart=/home/username/venv/bin/python /home/username/app/app.py

Restart=on-failure

RestartSec=5

[Install]

WantedBy=default.target

3. Далее включите и проверьте:

systemctl --user daemon-reload

systemctl --user enable myscript.service

systemctl --user start myscript.service

systemctl --user status myscript.service

Если автозапуск не срабатывает после перезагрузки, включите linger, чтобы пользовательские юниты стартовали без входа в систему:

loginctl enable-linger username

Вариант B: системный сервис (от root)

Нужен, когда требуется доступ к портам <1024, системным ресурсам или запуск до входа пользователей.

1. Создайте юнит с помощью команды:
sudo nano /etc/systemd/system/myscript.service

У него может быть следующее содержание:

[Unit]

Description=My root-level script

Wants=network-online.target

After=network-online.target

[Service]

Type=simple

User=myuser

Group=myuser

WorkingDirectory=/home/myuser

ExecStart=/home/myuser/bin/myscript.sh

Restart=on-failure

RestartSec=5

# При необходимости передавать переменные окружения:

# Environment="ENV=production" "PATH=/usr/local/bin:/usr/bin"

[Install]

WantedBy=multi-user.target

2. Включите и проверьте:

sudo systemctl daemon-reload

sudo systemctl enable myscript.service

sudo systemctl start myscript.service

sudo systemctl status myscript.service

Если скрипту нужен интернет, добавьте связку Wants=network-online.target и

After=network-online.target.

На рабочих станциях с NetworkManager используйте:

Wants=NetworkManager-wait-online.service

After=NetworkManager-wait-online.service

На серверах с systemd-networkd добавьте:

Wants=systemd-networkd-wait-online.service

After=systemd-networkd-wait-online.service

Вариант №2 — cron с директивой @reboot

Это более простой вариант, если не нужны зависимости и тонкая оркестрация.

Откройте crontab:

crontab -e

Добавьте строку:

@reboot /home/username/bin/myscript.sh >> /home/username/myscript.log 2>&1

Важно: cron запускает задачи с урезанной средой и может стартовать до полной готовности сети. Если нужен „запас времени“, добавьте мягкую задержку:

@reboot sleep 15 && /home/username/bin/myscript.sh >> /home/username/myscript.log 2>&1

Журналы будут доступны /var/log/syslog или через journalctl -u cron.

Автозапуск — это прежде всего про удобство и предсказуемость. Если сразу выбрать правильный механизм и аккуратно прописать детали, скрипты будут стабильно работать месяцами и без ручных перезапусков.