如何检测子进程是否正在等待屏幕输入?
检测Pi-hole安装子进程是否等待交互式输入的方法
首先说句实在的,Pi-hole本身就支持非交互式安装,这比费劲检测输入等待要高效得多。不过如果你确实需要检测子进程是否卡在等待输入的状态,下面是几种可行的方法:
一、通过进程状态和文件描述符判断
- 查进程状态:用
ps命令看目标进程的状态标记,等待终端输入的进程一般会显示T(停止状态,等着终端输入)或者S(可中断睡眠),再结合控制终端信息确认。比如执行ps -o state,pid,tty -p <子进程PID>,如果tty是当前终端且状态为T,基本就是在等输入了。 - 看标准输入状态:用
lsof工具查进程的标准输入(文件描述符0),如果显示的是终端设备(比如/dev/pts/0)且处于可读等待状态,说明进程在等输入。命令示例:lsof -p <PID> | grep -E 'FD=0.*CHR'
二、用终端交互工具检测+自动处理
expect工具:这是处理交互式脚本的老伙计,既能检测进程抛出的输入提示符,还能自动帮你输入。比如写个expect脚本匹配Pi-hole的选择菜单,一旦匹配到就知道进程在等输入,同时自动发送方向键或选择项。示例片段:
spawn pihole -r expect "Select Upstream DNS Provider" send -- "1\r" expect eof
script命令监控会话:用script -q -c "./pihole-install.sh" output.log运行安装脚本,然后实时盯着日志内容,当出现“Upstream DNS”这类菜单关键词时,就判断进程在等输入。
三、最优解:直接用Pi-hole的非交互式安装参数
没必要绕弯子,Pi-hole官方早就给了完全自动化的安装方式,靠环境变量就能跳过所有交互:
PIHOLE_SKIP_OS_CHECK=true:跳过系统兼容性检查PIHOLE_DNS_1="8.8.8.8"PIHOLE_DNS_2="8.8.4.4":指定上游DNS服务商- 还有其他参数比如
PIHOLE_SKIP_GIT_CLONE、PIHOLE_SKIP_INSTALL可以按需设置 - 完整的非交互式安装命令示例:
curl -sSL https://install.pi-hole.net | PIHOLE_SKIP_OS_CHECK=true PIHOLE_DNS_1="8.8.8.8" PIHOLE_DNS_2="8.8.4.4" bash
内容的提问来源于stack exchange,提问作者SmallCoder12
相关产品推荐
相关产品推荐

