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

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 который является синтаксически безопасным.

  • Почему startx зависает, если у меня нет подключения к Интернету в OpenBSD
  • Настроить ориентацию и разрешение дисплея на встроенном Linux
  • Debian 7 - Startx не запускает систему
  • Запустить диспетчер оконного браузера автономно
  • Gentoo как автоматически запускать программы при входе в систему?
  • startx не может открыть / dev / fb0: разрешение отклонено
  • Начните два сервера X при загрузке на RHEL
  • Каковы пользовательские группы openSUSE 13.1 по умолчанию?
  • Arch Linux загружается до tty1 по умолчанию вместо tty7 после обновления
  • X Пересылка с косвенным рендерингом завершается неудачей с более новыми клиентами
  • Как избежать вызова «startx» при входе в ssh
  • Пустой экран после входа в систему. Хотя виртуальная консоль работает. Пожалуйста, помогите
  • Interesting Posts

    mount: не удалось найти свободное устройство

    Какими процессами порты (в качестве конечных точек связи) относятся к пересылке портов SSH?

    Использование rename для удаления '.orig' из файла и добавления '_1' в basename

    В Vim, как я могу копировать несколько строк? (не диапазон);

    Удаление строки из файла, который имеет только определенный символ

    Скрипт для проверки наличия и копирования файла

    Перемещение кнопок мыши в tmux

    Программа на Debian8.3 выглядит иначе, чем на Fedora18

    Как и где интерпретируется $ TERM?

    Как настроить мой Android в качестве дополнительного монитора?

    Как объединить два файла разных строк и столбцов и вывести соответствующие строки с помощью колонок?

    не удалось изменить масштабирование i3wm

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

    Как отправить ключ анонимно на сервер через tor из командной строки?

    Что происходит, когда я делаю «cat debian.iso> / dev / sdX»?

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