A situação aqui é que você começa na linha de comando e depois chama startx quando estiver pronto. Empiricamente, você acredita que a GUI tenta executar novamente o .profile e o script python não pode sair para que a GUI seja interrompida.
Uma solução que pode valer a pena tentar é definir uma variável de ambiente para garantir que seu código seja executado apenas uma vez:
# 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
Outra opção é chamar o código somente se stdin estiver conectado a um terminal:
# 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
Esta segunda sugestão provavelmente é mais segura, porque ela tratará de programas que fazem login remotamente para executar um serviço (como rsync ou scp ).
Você pode mesclar os dois de forma que o código seja considerado apenas uma vez e só executado se stdin e stdout estiverem conectados a um terminal. (Apenas aninhe as instruções if...fi .)
Fui solicitado a explicar a condição test que protege o código no primeiro exemplo.
if test -z "$DONE_PROFILE" -o "X$DONE_PROFILE" != "X${USER:-unknown}"
Isso pode ser escrito em inglês como " Se $DONE_PROFILE estiver vazio Ou $DONE_PROFILE não corresponder a $USER ... ".
A construção ${USER:-unknown} substitui unknown se $USER estiver vazia ou não definida.
Colocar X na frente de ambos os lados da expressão != provavelmente é desnecessário nessa instância, mas é proveniente de uma abordagem de script defensiva. Considere uma variável $A que tenha o valor -z e outra variável $B com o valor apple . Em alguns shells, escrever test "$A" != "$B" seria expandido como test -z != apple , o que é sintaticamente inválido. Prefixar ambos os lados com X resultaria em uma expansão de test X-z != Xapple que é sintaticamente segura.