Я совсем новичок, и эта задача непростая, как я думал на первый взгляд. Я использую raspberryPi4 с Raspberry Pi OS Desktop с установленным рекомендованным программным обеспечением (действительно похоже на все Ubuntu, но GPIO работает с первой загрузки).
С успехом у меня есть написал программу .py (названную button_tab.py ), который изменяет мою вкладку chromium при нажатии физической кнопки , подключенной через контакты GPIO малины.
Мне нужно запустить этот .py-скрипт при запуске системы
#name of the file: button_tab.py
import RPi.GPIO as GPIO
import subprocess
import time
GPIO.setmode(GPIO.BOARD)
buttonPin = 36
GPIO.setup(buttonPin, GPIO.IN, pull_up_down=GPIO.PUD_UP)
while True:
buttonState = GPIO.input(buttonPin)
if buttonState == False:
subprocess.call(["xdotool", "key", "ctrl+Tab"])
time.sleep(0.5)
Эта программа отлично работает, когда я запускаю ее через:
python3 button_tab.py
Каждый раз, когда я нажимаю кнопку, она меняет вкладку в выбранном Окно хрома , как если бы я нажимал клавиши клавиатуры ctrl + tab , и у него есть время восстановления 0,5 секунды, чтобы не запускать его несколько раз одновременно.
Я даже создал сценарий listen_for_button.sh , чтобы выполнять его через bash.
#! /bin/sh
echo "Starting listen-for-button.py"
python3 /usr/bin/button_tab.py
Когда я запускаю его вручную, он тоже работает
./listen_for_button.sh
Теперь проблема:
Мне нужно запустить этот скрипт при запуске , поэтому я установил все модули pip3 для sudo
(например, sudo -H pip3 install subprocess.run
) и начал пробовать разные решения:
@reboot / home / pi /listen_for_button.sh
(нет) /etc/init.d/
и разрешить его через sudo rcconf
(после установки через sudo aptitute install rcconf sysv-rc-conf
) (нет) sudo nano / etc / profile
файл конфигурации ~ / bashrc, добавляющий / bin / bash / home / pi / listen_for_button.sh
внизу файла ( что-то перемещается , но логин застрял в моем процессе, вероятно, потому что рабочий стол не отображается, только черный экран) # файл button_tab.service :
[Unit]
Description=Button Tab Service
After=multi-user.target
Conflicts=getty@tty1.service
DefaultDependencies=false
[Service]
Type=simple
Environment="PATH=/home/{{ user }}/.local/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin"
ExecStart=/usr/bin/python3 /usr/bin/button_tab.py
Restart=on-abort
User=pi
[Install]
WantedBy=multi-user.target
и включить его через:
sudo systemctl daemon-reload
sudo systemctl enable button_tab.service
sudo systemctl start button_tab.service
Процесс работает ( зеленый свет при запросе статуса через sudo systemctl status button_tab.service
), но кнопка не работает, даже если процесс запущен. Я пробовал разные конструкции файла .service: это последняя версия. Все изменения в файле .service приводят к одному и тому же результату: nope
Я обнаружил, что единственный способ заставить кнопку работать - это запустить вручную, либо скрипт button_tab.py , либо сценарий listen_for_button.sh .
Ни один из автоматических способов не работает.
Возможно, мне не хватает чего-то базового, например, поведения xdotool ... Я действительно не знаю!
Пожалуйста, я вызываю sudo help
Спасибо
Решено! Благодаря комментариям @Ray было достаточно, чтобы сделать это:
sudo nano /etc/profile
и добавьте в нижнюю часть файла:
nohup /bin/bash /home/pi/listen_for_button.sh
Это делает, ~ / Bashrc выполняют файл .sh на заднем плане, без вывода вообще. Таким образом, процесс входа в систему может продолжаться плавно, и файл .sh действует так, как если он выполняется пользователем <3
, я надеюсь, что это может помочь кому-то еще. Всего наилучшего