Запуск программы в .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() 

  • Как запустить новый графический интерфейс с пользовательской командой из tty1?
  • Какая именно команда запускает сеанс openbox-lxde по умолчанию в raspbian?
  • Как начать вторую сессию X?
  • Ubuntu 14.04 войти на рабочий стол в режиме одного пользователя
  • Debian 7 - Startx не запускает систему
  • Что начинается с i3 при запуске startx?
  • Как отслеживать, что происходит во время входа в сеанс X11?
  • Является ли startx устаревшим?
  • 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 который является синтаксически безопасным.

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