Скрипт на Raspberry Pi запускается два раза при автозагрузке

На Raspberry pi есть телеграмм бот, который должен автоматически запускаться при запуске системы Raspberry Pi Os; Однако так как я использую VNC Server и VNC Viewer для управления Raspberry Pi удаленно, скрипт который запускает бота, по неведомым мне причинам, запускается и в системе, и на VNC клиенте. Из-за этого бот выдает ошибку, что запущенно несколько ботов и поэтому перестает нормально работать.



Что нужно сделать, чтобы бот запускался только на VNC сервере и был виден при входе с VNC клиента?



Файл автозагрузки Start_BOT.desktop находится в этой папке /home/pi/.config/autostart/Start_BOT.desktop

Его содержимое:

[Desktop Entry]
Encoding=UTF-8
Name=BotServer
Exec=lxterminal -e /home/pi/TelegramBots/Bot_Linux/Start_Bot
Icon=lxterminal
Type=Application
Categories=Utility;

Фото ошибки с VNC клиента (оно идентично ошибке в системе): Фото ошибки


Ответы (1 шт):

Автор решения: Георгий Иванов

Итак проблему я решил немного другим способом из-за новых обстоятельств, которые теперь вынуждают меня перезагружать бота после его закрытия.

Для начала я установил xterm (так как он показался мне удобней):

sudo apt-get update
sudo apt-get install xterm

Затем я установил systemd:

sudo apt-get update
sudo apt-get install systemd



[!] Учитывайте, что файлы с расширением .desktop и .service должны находится там где они находятся у меня. Остальные месторасположения файлов зависят только от вас [!]


После этого мною было создано 2 скрипта и 1 файл с расширением .service, и 1 файл с расширением .desktop.


[1] Первый скрипт запускал скрипт, который открывал бота в новом окне именно на VNC, а не в системе. Его код:

#!/bin/bash
DISPLAY=:1 xterm -e /home/pi/TelegramBots/Bot_Linux/Startup_Bot

Не забываем сделать файл исполняемым! C помощью команды в терминале:
chmod +x /home/pi/TelegramBots/Bot_Linux/Startup_Bot


[2] Затем идёт файл start_bot.service, который я создал по пути /etc/systemd/system/.
Команда для создания файла: sudo nano /etc/systemd/system/start_bot.service
В файле прописываем:

[Unit]
Description=Bot Startup Script
After=graphical.target
After=network.target

[Service]
Environment=XAUTHORITY=/home/pi/.Xauthority
DISPLAY=:1
User=pi
Type=idle
ExecStart=/home/pi/TelegramBots/Bot_Linux/Startup_Bot.sh
User=pi
Environment=XAUTHORITY=/home/pi/.Xauthority
RestartSec=10
Restart=always

[Install]
WantedBy=graphical.target


После этого выходим из nano нажатием Ctrl+X, затем жмём Y и потом нажимаем Enter.

[3] Потом создаем скрипт который активирует нашего demon. Для этого создаем скрипт с названием ReloadDemons и в моем случае по такому месторасположению /home/pi/TelegramBots/ReloadDemons.
Содержимое скрипта:

#!/bin/bash
sudo systemctl daemon-reload
sudo systemctl enable start_bot
sudo systemctl start start_bot

Не забываем сделать файл исполняемым! C помощью команды в терминале:
chmod +x /home/pi/TelegramBots/ReloadDemons



[4] После этого я создал файл автозагрузки с расширением .desktop который запускал скрипт описанный выше.
Его месторасположение: /home/pi/.config/autostart/reboot_demons.desktop
И его содержимое:

[Desktop Entry]
Type=Application
Name=Restart Demons
Exec=/home/pi/TelegramBots/ReloadDemons
StartupNotify=false



Всё сохраняем и выполняем команду sudo reboot


Надеюсь мой ответ помог кому то, кто сталкивался с подобной проблемой!

Ссылки которые помогли мне решить эту проблему:
https://unix.stackexchange.com/questions/617201/is-it-possible-to-have-systemd-open-a-program-running-in-a-clean-terminal-automa

Как автоматически перезапустить бота в случае ошибки?

→ Ссылка