如何确定串行终端何时已连接(断开)?

如何确定串行终端何时已连接(断开)?

我有一个十二月VT101使用 USB RS-232 零调制解调器电缆连接到运行 Debian 的 Raspberry Pi 3 的串行终端。当我关闭终端时,我希望 shell 会话结束,当我重新打开终端时,我希望启动一个新的登录会话。我怎样才能做到这一点?现在,当终端关闭然后重新打开时,屏幕保持空白,直到我执行某些操作,例如按 Return 键,这将使 Bash 绘制一个新的提示符。

至少,如果我能弄清楚如何查询是否有系统从 USB 空调制解调器电缆接收数据,我可以自己编写自动登录/注销的脚本。我想到的一种方法是,当最近没有用户输入时,向终端发送应答查询,然后如果在一段时间后没有得到响应,则假设终端已关闭。

答案1

通常的方法是检测 DTR(“数据终端就绪”)信号何时下降。这确实需要的不仅仅是接地、接收数据和传输数据的连接。

stty必须调整设置才能忽略 DTR 信号。尝试跑步stty -clocal。如果您的连接立即断开,则说明您的电缆没有连接适当的引脚。如果运行 stty 命令后仍然有 shell 连接,请尝试关闭然后打开终端。我预计会话会被终止。如果没有,则串行电缆可能会将来自 RS232 适配器的 DSR(“数据集就绪”)信号循环回其 DTR 输入;您可以通过从适配器上拔下电缆来测试这一点,看看是否会导致您退出。如果是这样,则需要重新连接串行电缆。

答案2

由于我无法弄清楚如何使用现有硬件进行挂断检测,因此我创建了一个基于软件的解决方案,称为哈普蒙In 通过向终端发送光标位置报告 (CPR) 序列并等待响应来确定终端是否在线。如果没有收到响应,则认为终端离线。该存储库包括一个脚本和 systemd 单元文件,可以用来代替年龄(8)其功能与此脚本类似:

stty 19200 sane -brkint ixoff -imaxbel

while :; do
    if [ "$(hupmon -1)" = "DEVICE_ONLINE" ]; then
        stty 19200 sane -brkint ixoff -imaxbel
        printf "\033[r\033[H\033[J" # Clear the screen.
        TERM="vt100" hupmon /bin/login
    fi

    sleep 1
done

相关内容