我有一个烧瓶
app.py
,我正在本地机器上开发。
Flask 应用程序使用连接到远程计算机的串行接口(pyserial)。
我设置 PyCharm 以在远程计算机上进行远程部署。
当我(从本地计算机)远程部署和运行应用程序时,我想在独立的
screen
中启动它,以便在需要时可以断开与 SSH 的连接。
为此,我编写了这个简单的 python 脚本
detach_app.py
:
import sys
import subprocess
import shlex
command = "/opt/homebrew/bin/screen -S flask -d -m " + sys.executable + " app.py"
command = shlex.split(command)
subprocess.Popen(command, start_new_session=True)
在 PyCharm 中时,我远程部署
detach_app.py
它在屏幕中运行 app.py
并分离屏幕。它还将屏幕分配给一个新会话,以便它成为 init
进程的子进程,并且在 python 脚本结束时不会关闭。
这很有效,因为如果我稍后需要检查进程,我只需通过 PyCharm 中的终端 SSH 到机器并执行
screen -r flask
。
但是,我遇到了一个奇怪的问题,当我通过此方法启动
app.py
时,串行接口行为异常。特别是,设备能够打开串行端口,但它只会发送空字符串。
请注意,如果满足以下条件,则不会发生此行为:
app.py
app.py
或 through screen
detach_app.py
,但我没有使用 screen
,而是使用 nohup
看来串行接口问题是由屏幕和PyCharm远程部署的组合引起的。 我知道这是一个牵强的问题,但我真的很难理解接下来要尝试调查该问题的事情是什么。
有人对此有任何指示吗?
经过更深入的调试,我发现问题只与
pyserial
和MacOS有关,与screen
无关。
我特别注意到,读取空白 USB 回复的问题是在退出 VNC 连接 1 分钟后发生的。
然后我怀疑操作系统正在进入睡眠状态并出于某种原因停用
tty
,即使我已将其设置为从不进入睡眠状态。
我启动了命令
pmset -g
并注意到这两行
sleep 1 (sleep prevented by screensharingd, powerd)
ttyskeepawake 1
man pmset
有关 ttyskeepawake
和睡眠如何交互的更多详细信息,但如果您注意到,screensharingd
(VNC) 会阻止操作系统进入睡眠状态。当VNC退出时,它需要一分钟才能进入睡眠状态。
我使用命令修改了设置
sudo pmset -a sleep 0
我目前的完整状态是:
System-wide power settings:
Currently in use:
standby 0
Sleep On Power Button 1
autorestart 0
SleepServices 0
powernap 0
networkoversleep 0
disksleep 0
sleep 0 (sleep prevented by screensharingd, powerd)
ttyskeepawake 1
displaysleep 0
tcpkeepalive 1
lowpowermode 0
womp 1