Запуск программы в .profile предотвращает запуск графического интерфейса пользователя

Я хочу запустить программу python, которая проверяет клавиатуру при запуске / входе на мой малиновый pi.

Предыдущие попытки включали задания cron (из-за отсутствия stdin или stdout).

rc.local также потерпел неудачу, поскольку у него нет stdin (он застрял в бесконечной петле – теперь это было весело, чтобы убежать)

Поэтому я пришел, чтобы поместить мою команду в .profile, и это, похоже, работает хорошо! Программа функционирует точно так, как предполагалось, когда Pi включен, но

Когда я пытаюсь запустить GUI с помощью startx , экран становится черным и полностью не запускается. Кажется, что это связано с программой Ppython, потому что, когда я удаляю ее из bash .profile, все работает нормально.

Любая помощь была бы оценена по достоинству!

Обновить

Я создал сценарий, который также выводит на светодиоды (простая последовательность Red-Yellow-Green), и кажется, что .profile выполняется снова, когда запускается startx ? Если да, то почему?

Ниже мой код .profile, а затем моя программа python; значение сценария python (я считаю), что он запускает поточный бесконечный цикл, который заканчивается stdin / keyboard

.profile

 echo "About to run keyboard polling"; sleep 3 python /home/pi/poll_keyboard.py 

poll_keyboard.py

 import thread import time def input_thread(L): key = raw_input() L.append(key) thread.exit() #Should close thread at end def do_print(): L = [] thread.start_new_thread(input_thread, (L,)) i = 0 while True: print "Hello World %d" % i if L: #If anything has been detected break i += 1 time.sleep(0.5) return L key = do_print() print "Key press detected: %s. Exiting in 2" % key time.sleep(2) exit() 

  • Проблема с Arch Linux Gnome
  • Gentoo как автоматически запускать программы при входе в систему?
  • Графический интерфейс Gnome не загружен
  • Разница между .xinitrc, .xsession и .xsessionrc
  • Как запустить новый графический интерфейс с пользовательской командой из tty1?
  • Ошибка входа в диспетчер дисплея X, вход в консоль + startx работает
  • Какая именно команда запускает сеанс openbox-lxde по умолчанию в raspbian?
  • Пустой экран после входа в систему. Хотя виртуальная консоль работает. Пожалуйста, помогите
  • One Solution collect form web for “Запуск программы в .profile предотвращает запуск графического интерфейса пользователя”

    Ситуация здесь заключается в том, что вы начинаете в командной строке, а затем вызываете startx когда будете готовы. Эмпирически вы считаете, что GUI пытается повторно выполнить .profile и скрипт python не может выйти, поэтому GUI зависает.

    Одним из решений, которое стоит попробовать, является установка переменной среды для обеспечения того, чтобы ваш код запускался только один раз:

     # This is .profile # if test -z "$DONE_PROFILE" -o "X$DONE_PROFILE" != "X${USER:-unknown}" then # Protected code here will be called only once # echo "About to run keyboard polling"; sleep 3 python /home/pi/poll_keyboard.py export DONE_PROFILE="${USER:-unknown}" fi 

    Другой вариант – вызвать код только в том случае, если stdin подключен к терминалу:

     # This is .profile # if test -t 0 -a -t 1 then # Protected code here will be called only if stdin and stdout is a tty # echo "About to run keyboard polling"; sleep 3 python /home/pi/poll_keyboard.py fi 

    Это второе предложение, вероятно, безопаснее, потому что оно будет обрабатывать программы, которые будут удаленно регистрироваться для запуска службы (например, rsync или scp ).

    Вы могли бы даже объединить эти два, чтобы код рассматривался только один раз, а затем выполнялся только в том случае, если stdin и stdout подключены к терминалу. (Просто if...fi операторы if...fi .)


    Меня попросили объяснить условие test которое защищает код в первом примере.

     if test -z "$DONE_PROFILE" -o "X$DONE_PROFILE" != "X${USER:-unknown}" 

    Это может быть написано на английском языке как « Если $DONE_PROFILE пуст или $DONE_PROFILE не соответствует $USER ».

    Конструкция ${USER:-unknown} заменяет unknown если $USER пуст или не установлен.

    Помещение X перед обеими сторонами выражения != Вероятно, не нужно в этом случае, но оно исходит из подхода защитного сценария. Рассмотрим переменную $A которая имеет значение -z , и другую переменную $B со значением apple . В некоторых оболочках запись test "$A" != "$B" будет расширяться как test -z != apple которое синтаксически недействительно. Префикс с обеих сторон с X приведет к расширению test Xz != Xapple который является синтаксически безопасным.

    Interesting Posts

    Почему я получаю сообщение об ошибке «print_unicode: строка 9: printf: отсутствует символ Unicode для Unicode 0187» с этим скриптом

    grep – многострочный рисунок

    Связь между исполняемым скриптом zsh и конфигурацией compsys / zstyle

    Предотвращение исходящего спама электронной почты от VPS клиента

    Почему правило iptable не может быть указано?

    Не возникают ли специальные символы на дорожках при подключении сетевых ресурсов?

    Мой crontab любит только пять звездочек (связанный с часовым поясом?)

    Как я могу с двумя загрузками FreeBSD и PC-BSD – с GRUB2 в MBR?

    Установка шрифтов Powerline для темы zsh + Prezto

    Не удалось запустить slapd в CentOS

    Каков наилучший способ запускать fsck.hfsplus перед установкой внешнего диска (HFS +)?

    Почему лидер Tmux Space также делает 2 лидером?

    Как проверить из командной строки, что доступная сеть?

    Как печатать только последний столбец?

    Переслать X11 через два туннеля SSH

    Linux и Unix - лучшая ОС в мире.