![在 .profile 中运行程序会阻止 GUI startx](https://linux22.com/image/96896/%E5%9C%A8%20.profile%20%E4%B8%AD%E8%BF%90%E8%A1%8C%E7%A8%8B%E5%BA%8F%E4%BC%9A%E9%98%BB%E6%AD%A2%20GUI%20startx.png)
我想运行一个 python 程序,在启动/登录我的树莓派时轮询键盘。
之前的尝试包括 cron 作业(由于缺少标准输入或标准输出而失败)。
rc.local
也失败了,因为它没有标准输入(它陷入了永久循环 - 现在那逃脱很有趣)
因此,我已经将命令放入 .profile 中,这看起来效果很好!当 Pi 打开时,程序完全按照预期运行但...
当我尝试通过 启动 GUI 时startx
,屏幕变黑并且完全无法启动。这似乎与 Ppython 程序有关,因为当我从bash
.profile 中删除它时,它一切正常。
任何帮助将不胜感激!
更新
我创建了一个脚本,它也输出到 LED(一个简单的红-黄-绿序列),并且 .profile 似乎已执行再次什么时候startx
运行?如果是这样为什么?
下面是我的 .profile 代码,然后是我的 python 程序; python脚本的意义在于(我相信)它运行一个由标准输入/键盘终止的线程永久循环
.轮廓线
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()
答案1
这里的情况是,您从命令行开始,然后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
另一种选择是仅在以下情况下调用代码标准输入连接到终端:
# 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
)。
您甚至可以将两者合并,以便代码仅被考虑一次,然后仅在以下情况下执行:标准输入和标准输出连接到终端。 (只需嵌套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
。在某些 shell 中,书写test "$A" != "$B"
会扩展,因为test -z != apple
这在语法上是无效的。两边都加上前缀X
会导致test X-z != Xapple
其扩展在语法上是安全的。