Моя цель была такой же, как у оригинального плаката, но с одним отличием :Мне нужно было запустить приложение SDL как демон systemd. Моя машина с Linux — Raspberry Pi 3, а операционная система — Raspbian Jessie. Клавиатура или мышь не подключены к RPi. Подключаюсь к нему по SSH. Мое приложение SDL на самом деле основано на Pygame -. Я установил pygame/SDL для использования драйвера кадрового буфера «fbcon» через переменную среды SDL _VIDEODRIVER. Мой вывод systemd --version
—:
systemd 215 +PAM +AUDIT +SELINUX +IMA +SYSVINIT +LIBCRYPTSETUP +GCRYPT +ACL +XZ -SECCOMP -APPARMOR
Моя версия пакета pygame:(aptitude show python-pygame
):
1.9.2~pre~r3348-2~bpo8+rpi1
Моя версия libSDL 1.2:(aptitude show libsdl1.2debian
-на вашем компьютере имя пакета может быть другим):
1.2.15-10+rpi1
Добавьте эти строки в раздел [Service] вашего демона.service файл:
User=pi #Your limited user name goes here
StandardInput=tty
StandardOutput=tty
TTYPath=/dev/tty2 # I also tried /dev/tty1 and that didn't work for me
Если кому интересно, вот полный файл pyscopefb.service, который я использовал:
[Unit]
Description=Pyscopefb test service
Wants=network-online.target
After=rsyslog.service
After=network-online.target
[Service]
Restart=no
ExecStart=/home/pi/Soft/Test/pygame/pyscopefb
ExecStop=/bin/kill -INT $MAINPID
OOMScoreAdjust=-100
TimeoutStopSec=10s
User=pi
WorkingDirectory=/home/pi/Soft/Test/pygame
StandardInput=tty
StandardOutput=tty
TTYPath=/dev/tty2
[Install]
WantedBy=multi-user.target
Введите эти команды в командной строке (Я предполагаю, что файл pyscopefb.service уже помещен в нужное место, где systemd может его найти):
sudo systemctl daemon-reload
sudo systemctl start pyscopefb
Это работает для меня. Обратите внимание, что я не проверял, может ли приложение pygame получать события клавиатуры и мыши или нет.
Пришлось решить еще 2 задачи, которые тоже могут быть интересны
В нижней части экрана мигал текстовый курсор с графика фреймбуфера. Чтобы решить эту проблему, я добавил в свое приложение следующий код Python, который запускается в моем приложении до инициализации Pygame/SDL:
def _disable_text_cursor_blinking(self):
command_to_run = ["/usr/bin/sudo", "sh", "-c", "echo 0 > /sys/class/graphics/fbcon/cursor_blink"]
try:
output = subprocess32.check_output(command_to_run, universal_newlines = True)
self._log.info("_disable_text_cursor_blinking succeeded! Output was:\n{output}", output = output)
except subprocess32.CalledProcessError:
self._log.failure("_disable_text_cursor_blinking failed!")
raise
Примерно через 10 минут экран подключился к HDMI Raspberry Pi. вывод стал черным (, но не выключился ), и моя графика не display, хотя Pygame не сообщил об ошибках. Это оказалось функция энергосбережения.Чтобы отключить это, я добавил следующий Python код, который также запускается до инициализации Pygame/SDL:
def _disable_screen_blanking(self):
command_to_run = ["/usr/bin/setterm", "--blank", "0"]
try:
output = subprocess32.check_output(command_to_run, universal_newlines = True)
self._log.info("_disable_screen_blanking succeeded! Output was:\n{output}", output = output)
except subprocess32.CalledProcessError:
self._log.failure("_disable_screen_blanking failed!")
raise
Используя __install
в качестве примера, вы можете увидеть, где это определено с помощью
rpm --showrc | grep __install
Или вы можете увидеть определение с помощью
rpm --eval "%{__install}"