如何在后台启动交互式CLI应用并转发当前Shell的STDIN?
问题根因
termios.error: (25, 'Inappropriate ioctl for device')报错的核心原因是:bpytop作为交互式终端UI程序,需要获取当前终端的属性完成界面绘制、键盘输入响应,而直接用&放到后台运行的进程会被系统剥夺终端控制权,无法访问stdin对应的tty设备。
最优解决方案
不需要额外做stdin管道转发,只要调整脚本逻辑,把配置文件监控逻辑放到后台运行,让bpytop保持在前台占用终端即可,修改后的脚本如下:
#!/bin/bash CONFIG_FILE="$HOME/.config/bpytop/bpytop.conf" # 退出时清理所有子进程 cleanup() { pkill -P $$ &>/dev/null exit 0 } trap cleanup EXIT INT TERM while true; do # 后台启动配置监控,变更时杀掉当前bpytop实例触发重启 (inotifywait -e modify "$CONFIG_FILE" && pkill -x bpytop) & MONITOR_PID=$! # bpytop前台运行,正常占用当前终端的输入输出 bpytop # 清理残留的监控进程 kill "$MONITOR_PID" &>/dev/null wait "$MONITOR_PID" &>/dev/null # 增加短延时避免配置写入未完成就重启导致读取异常 sleep 0.2 done
该方案无需额外依赖,bpytop的所有交互功能都可以正常使用,切换日夜模式修改配置文件后会自动重启加载新配色。
备选方案(后台绑定tty)
如果确实需要保持原来的逻辑把bpytop放到后台运行,可直接将bpytop的输入输出重定向到当前终端设备,把原脚本中的bpytop &修改为:
bpytop < /dev/tty > /dev/tty 2>&1 &
该方案稳定性低于前者,可能出现后台进程接收终端信号异常的问题,仅作为临时替代方案使用。
内容的提问来源于stack exchange,提问作者Hubro
相关产品推荐
相关产品推荐

