Автозагрузка .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 &
вроде помогло думал я но прошло пару часов и боты перестали работать, и так было дальше когда я перезагружал устройство они вроде работали, проходит пару часов и все боты неактивны что делать?
Ответы (3 шт):
Ну это довольно просто. В случае, если на апельсине стоит что-то убунтуподобное, то работает на 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 &
- пишем простейший скрипт /home/orangepi/testbot.sh(он тоже должен быть исполняемым)
#!/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
- в crontab добавляем
*/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 &
- а далее все тоже самое с crontab, как написал выше.
Как вариант, если у Вас есть systemd
sudo nano /etc/systemd/system/<your_bot_name>.service
Туда копируете вот такой текст заменив текст в <> на ваши параметры:
[Unit]
Description=<YOUR BOT DESCRIPTION>
After=network.target
[Service]
Type=simple
User=<имя пользователя от которого вы запускаете скрипты>
Group=<группа пользователя от которого вы запускаете скрипты>
Environment=PYTHONPATH=</full/path/to/directory/with/your/script>
WorkingDirectory=</full/path/to/directory/with/your/script>
ExecStart=</full/path/to/python> </full/path/to/your/script>
Restart=always
RestartSec=5
[Install]
WantedBy=network.target
Далее:
Ctrl+X, y для сохранения файла юнита который только что создали
Затем
sudo systemctl daemon-reload
sudo systemctl start <your_bot_name>.service
sudo systemctl status <your_bot_name>.service
# если все норм и юнит запустился...
sudo systemctl enable <your_bot_name>.service
Так же можно использовать для запуска 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 для каждого скрипта должен быть свой