Vaspkit的804任务无法通过echo+管道输入后续参数,如何实现自动输入?
Vaspkit 804任务自动输入解决方案
猜想验证方法
如果需要确认804任务是否绕过标准输入直接读取终端内容,可采用以下两种方法验证:
- 系统调用跟踪法
执行如下命令,观察输出内容:
输入804后如果返回类似strace -e open,openat vaspkit 2>&1 | grep /dev/ttyopenat(AT_FDCWD, "/dev/tty", O_RDWR|O_NOCTTY) = 3的记录,即可确认程序直接读取终端设备,管道传参失效是该原因导致。 - 伪终端测试法
执行如下脚本,观察804任务是否可正常完成:
如果无卡顿正常跑完流程,即可验证上述结论。script -q /dev/null vaspkit << EOF 804 0.5 3.2 20 EOF
可行自动输入方案
方案1:expect伪终端适配
expect本质是模拟真实终端交互,可适配包括类GUI终端界面在内的所有终端交互场景,示例脚本如下:
#!/usr/bin/expect -f spawn vaspkit send "804\r" set timeout 2 send "0.5\r" send "3.2 20\r" expect eof
保存为auto_804.exp后执行chmod +x auto_804.exp添加执行权限,直接运行即可自动完成全部参数输入。
方案2:tmux按键发送(兼容性最强)
针对所有终端交互类程序通用的方案,通过后台tmux会话模拟手动按键输入:
# 新建后台tmux会话 tmux new-session -d -s vaspkit_session # 启动vaspkit tmux send-keys -t vaspkit_session "vaspkit" C-m # 依次发送参数,C-m对应回车键 tmux send-keys -t vaspkit_session "804" C-m tmux send-keys -t vaspkit_session "0.5" C-m tmux send-keys -t vaspkit_session "3.2 20" C-m # 等待执行完成后输出结果并销毁会话 sleep 5 tmux capture-pane -t vaspkit_session -p tmux kill-session -t vaspkit_session
可根据804任务实际执行时长调整sleep的时间参数。
方案3:临时伪终端重定向(无需额外安装工具)
仅适合临时测试使用,稳定性略差:
# 新建模拟终端管道 mkfifo fake_tty # 后台按顺序写入参数 { echo 804; sleep 0.1; echo 0.5; sleep 0.1; echo "3.2 20"; } > fake_tty & # 绑定伪终端运行vaspkit vaspkit < fake_tty # 执行完成后删除临时管道 rm fake_tty
内容的提问来源于stack exchange,提问作者Jacek
相关产品推荐
相关产品推荐

