- Автозагрузка .py скрипта на Linux
- 3 ответа 3
- Как установить в автозапуск python-скрипт используя systemd
- 1. Простой python-scrypt
- 2. Создание файла сервиса.
- 3. Включение нового добавленного сервиса.
- 4. Запуск/Остановка/Статус сервиса
- Auto Start Python Script on Boot (Ubuntu 20.04, Systemd)
- Create Bash Script
- Create Python Script
- Test Systemd
- Anaconda
- Как поставить на автозапуск python скрипт в linux?
- Войдите, чтобы написать ответ
- Как настроить BIOS под Linux в Thinkpad?
Автозагрузка .py скрипта на Linux
Друзья всем привет, купил себе Orangepi чтоб сделать с него сервер для телеграм ботов, мне нужно чтоб боты сами запускались после перезагрузки устройства, я пробовал много способов но хоть както помог только один через: sudo crontab -e я туда записал это:
@reboot python3 /home/orangepi/bots/weather_bot/weather_bot.py & @reboot python3 /home/orangepi/bots/echo_bot/main.py &
вроде помогло думал я но прошло пару часов и боты перестали работать, и так было дальше когда я перезагружал устройство они вроде работали, проходит пару часов и все боты неактивны что делать?
Для начала нужно выяснить, что же происходит: падает скрипт, отваливается сеть или устройство уходит в спячку. Выяснив причину можно будет думать о решении. В качестве костыля: попробовать обернуть в бесконечный цикл
в коде скриптов while True: main() , где main() — функция, в которой расположен код. Это не поможет, если скрипты падают по исключительной ситуации(Exception/Error)
3 ответа 3
Как вариант, если у Вас есть systemd
sudo nano /etc/systemd/system/.service
Туда копируете вот такой текст заменив текст в <> на ваши параметры:
[Unit] Description= After=network.target [Service] Type=simple User= Group= Environment=PYTHONPATH= WorkingDirectory= ExecStart= Restart=always RestartSec=5 [Install] WantedBy=network.target
Далее: Ctrl+X, y для сохранения файла юнита который только что создали
sudo systemctl daemon-reload sudo systemctl start .service sudo systemctl status .service # если все норм и юнит запустился. sudo systemctl enable .service
Ну это довольно просто. В случае, если на апельсине стоит что-то убунтуподобное, то работает на sysnemd. Делаем так:
- systemctl enable rc-local
- в файле /etc/rc.local прописываем(ваши скрипты должны иметь права на запуск)
sudo -u orangepi /home/orangepi/bots/weather_bot/weather_bot.py & sudo -u orangepi /home/orangepi/bots/echo_bot/main.py &
#!/bin/bash if ps ax | grep python | grep -vq grep then echo "python is already running" exit 0 else echo "starting python" sudo -u orangepi /home/orangepi/bots/weather_bot/weather_bot.py & sudo -u orangepi /home/orangepi/bots/echo_bot/main.py & echo "ok" fi
*/10 * * * * /home/orangepi/testbot.sh #проверка каждые 10 минут
Для openrc(что мне привычней) несколько иначе.
- sudo ln -s /etc/init.d/local /etc/runlevels/default/local #ну не люблю я все эти rc-update
- в файле /etc/local.d/startup.start (должен быть исполняемым) пишем:
sudo -u orangepi /home/orangepi/bots/weather_bot/weather_bot.py & sudo -u orangepi /home/orangepi/bots/echo_bot/main.py &
Так же можно использовать для запуска flock — программа которая позволяет запускать только один процесс. Для использования достаточно добавить задание в cron:
* * * * * user flock /var/lock/weather_bot.lock python3 /home/orangepi/bots/weather_bot/weather_bot.py
Запуск задания будет происходить каждую минуту, но пока процесс первого запущенного экземпляра не будет завершен, следующие процессы не будут запущены. Т.е. случился «краш» скрипта или его логическое завершение, то в течении минуты запустится новый экземпляр. Так же можно поставить таймаут ожидания, для мгновенного запуска, ключ -w . Поставим значение на ожидание 58секунд:
* * * * * user flock -w58 /var/lock/weather_bot.lock python3 /home/orangepi/bots/weather_bot/weather_bot.py
flock будет ожидать 58 секунд до завершения текущего процесса и если запущенный процесс завершится, то будет запущен новый экземпляр, максимальный лаг между остановкой и запуском новой версии будет ~2 секунды.
Файл дескриптора /var/lock/.lock для каждого скрипта должен быть свой
Как установить в автозапуск python-скрипт используя systemd
Компьютерное
Иногда требуется какой-то скрипт или программу запускать как системный сервис. Это можно легко провернуть, если в вашем дистрибутиве используется система инициализации и управления демонами — systemd.
Для примера, я создам простейший python-скрипт который будет слушать 9988 порт и добавлю его в автозагрузку при старте операционной системы.
1. Простой python-scrypt
sudo nano /usr/bin/dummy_service.py
#!/usr/bin/python3 import socket s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) s.bind(("localhost", 9988)) s.listen(1) while True: conn, addr = s.accept() data = conn.recv(1024) conn.close() my_function_that_handles_data(data)
2. Создание файла сервиса.
Теперь создадим файл сервиса для с помощью которого расскажем systemd что нам требуется. Файл должен иметь расширение .service и находиться в директории /lib/systemd/system/
sudo nano /lib/systemd/system/dummy.service
Добавим информацию о нашем сервисе (можете изменить местоположение скрипта и описание сервиса):
[Unit] Description=Dummy Service After=multi-user.target Conflicts=getty@tty1.service [Service] Type=simple ExecStart=/usr/bin/python3 /usr/bin/dummy_service.py StandardInput=tty-force [Install] WantedBy=multi-user.target
Мне кажется из содержимого всё и так понятно — какая строка и за что отвечает.
3. Включение нового добавленного сервиса.
Вы добавили, наконец-то, ваш сервис в систему. теперь необходимо перезапустить демон systemctl чтобы он прочел новый файл. Каждый раз как вы вносите изменения в .service файлы вам нужно перезапустить демон.
sudo systemctl daemon-reload
Теперь включим запуск сервиса при загрузке системы, и запустим сам сервис.
sudo systemctl enable dummy.service sudo systemctl start dummy.service
4. Запуск/Остановка/Статус сервиса
В конце проверим статус нашего нового сервиса:
sudo systemctl status dummy.service
Проверим что наш python-скрипт слушает нужный нам порт:
Команды для запуска, остановки и перезапуска сервиса:
sudo systemctl stop dummy.service #Для остановки сервиса sudo systemctl start dummy.service #Для запуска сервиса sudo systemctl restart dummy.service #Для перезапуска сервиса
Auto Start Python Script on Boot (Ubuntu 20.04, Systemd)
NOTE: Use After=network.service if you require network.
Create Bash Script
#!/bin/bash # cd /code/python/myapppython3 /code/python/myapp/run.py >> /code/logs/myapp.log 2>&1
Create Python Script
nano /code/python/myapp/run.py
import signalimport timeimport datetime is_shutdown = False def stop(sig, frame): print(f"SIGTERM at datetime.datetime.now()>") global is_shutdown is_shutdown = True def ignore(sig, frsma): print(f"SIGHUP at datetime.datetime.now()>") signal.signal(signal.SIGTERM, stop)signal.signal(signal.SIGHUP, ignore) print(f"START at datetime.datetime.now()>") while not is_shutdown: print('.', end='', flush=True) time.sleep(1) print(f"END at datetime.datetime.now()>")
Test Systemd
sudo chmod 744 /code/scripts/myapp.shsudo chmod 664 /etc/systemd/system/myapp.service
sudo systemctl daemon-reloadsudo systemctl enable myapp.service
sudo systemctl start myapp.service
sudo systemctl start status.service
sudo systemctl stop myapp.service
Restart server to test if the service started on reboot
Anaconda
Systemd is run as root by default. If you are using Anaconda (or maybe pyenv ), current user might not run the same python version/environment as root.
NOTE: I tried changing the user via Service.User , but it still uses the system default python interpreter
You can find the python interpreter path using which python or python -c «import sys; print(sys.executable)»
which pythonsudo which python
Edit the bash script to use the correct python interpreter
/opt/conda/bin/python3 /code/python/myapp/run.py >> /code/logs/myapp.log 2>&1
❤️ Is this article helpful?
Buy me a coffee ☕ or support my work via PayPal to keep this space 🖖 and ad-free.
Do send some 💖 to @d_luaz or share this article.
A dream boy who enjoys making apps, travelling and making youtube videos. Follow me on @d_luaz
Travelopy — discover travel places in Malaysia, Singapore, Taiwan, Japan.
Как поставить на автозапуск python скрипт в linux?
Есть запускаю просто из под рута в консоле — всё срабатывает ок. Приложение запускается, всё отрабатывает ок.
Но не понимаю как это поставить на автозапуск (провайдер зачастил ребутать серверы).
Скрипт сервиса:
[Unit] Description=My Script Service After=default.target [Service] Type=simple ExecStart=/root/runserver.sh Restart=always User=root [Install] WantedBy=multi-user.target
Лежит в /lib/systemd/system/runapp.service
Скрин статуса:
Заодно подскажите куда как прописать правила iptables так же при старте 🙂
Что читаю и пытаюсь повторить — не работает :\
1. Вам влом прочитать документацию на инструменты используемые вами
— docs.gunicorn.org/en/stable/deploy.html
2. Вам влом в гугле вбить запрос на поиск методов деплоя используемых вами инструментов
— https://bartsimons.me/gunicorn-as-a-systemd-service/
3. Вам влом изучать операционную систему и её инструменты
— https://habr.com/ru/company/southbridge/blog/255845/
4. Выкиньте нафиг свой скрипт, systemd супервизор и он не занимается запуском скриптиков, а если уж очень хочется то не забывайте про «переменные среды».
Но зато не влом прийти и написать много букав на тостере и при этом даже не удосужились указать операционную систему, конкретную а не общее Linux коих 100500 дистров и у многих свои приколы.
[Unit] Description=My Script Service [Service] WorkingDirectory=/home/dev/myapp ExecStart=source venv/bin/activate && gunicorn -c gunicorn_config.py run_app:app Restart=always RestartSec=30 #перезагрузка сервиса, если вдруг упадет. StandardOutput=syslog StandardError=syslog SyslogIdentifier=my-python-app #Environment=NODE_ENV=production PORT=3080 (это для nodejs, но можете тоже поиграть, если надо). [Install] WantedBy=multi-user.target
Попробуйте разместить в /etc/systemd/
iptables на разных осях по разному. Создаете скрипт типа:
#! /bin/sh iptables -F iptables -X iptables -t nat -F iptables -t nat -X iptables -t mangle -F iptables -t mangle -X iptables -t raw -F iptables -t raw -X iptables -t security -F iptables -t security -X iptables -P INPUT DROP iptables -P OUTPUT ACCEPT iptables -P FORWARD DROP iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
По iptables нашел такое решение https://help.ubuntu.com/community/IptablesHowTo#Tips
+ наверно так же на сервис повешу, спасибо.
У меня VPS ubuntu 16.04
Еще помогло это https://habr.com/ru/post/351566/, у меня фласк, но суть так же
+ там есть очень важный момент — в конфиге гуникорна не должен стоять параметр daemon=True