【问题标题】:How to exit the interactive mode for yarn top command from within the bash script如何从 bash 脚本中退出 yarn top 命令的交互模式
【发布时间】:2025-12-18 21:35:01
【问题描述】:

我在 serverA 上有一个 bash 脚本。该脚本将 ssh 到 serverB 并运行 yarn top 命令,拉取指标并放入 serverA 上的文件(test.txt)中。以下是我正在使用的命令:

ssh -oStrictHostKeyChecking=no -i <key> username@hostname "yarn top" | head -5 | grep -w 'Applications' | awk '{print "Pending_apps" "\t" $7}' >> test.txt

所以这里的问题是,在我的脚本在命令之上运行后,它进入交互模式,并且只有当我手动给出 Ctrl+C 或退出信号/命令时它才会退出。

在运行上述命令并将输出重定向到 test.txt 后,脚本是否应该移动到下一个命令。也就是说,在命令提示符下运行上述命令后,它应该将输出重定向到 test.txt 文件,然后应该返回到命令提示符/终端

【问题讨论】:

    标签: linux bash shell scripting linux-mint


    【解决方案1】:

    您可以尝试通过管道输出echo 来模拟控制台,如下所示:

    (sleep $SLEEP_TIME; echo -e "q\n\n") | yarn top > yarn-top.log
    

    意思是:“运行yarn top,并并行,等待SLEEP_TIME,然后输出q和两个新行”。

    只要SLEEP_TIME 小于yarn top 上的默认刷新延迟(默认为3 秒),您将在yarn-top.log 上获得一次屏幕更新。如果您将SLEEP_TIME 设置为大于刷新延迟,您将在SLEEP_TIME 期间获得尽可能多的更新。

    您需要echo -e 来转义换行符。您需要它们,因为yarn top 是用 java 实现的。见yarn top --help:

    1. 由于该工具是用 Java 实现的,因此您必须按 Enter 键才能处理按键。

    【讨论】:

      【解决方案2】:

      Classic top 可以在非交互模式下运行 top -n 1 不幸的是我找不到 yarn top 的文档

      或者你可以尝试在后台运行命令(&amp;),保存它的 pid,等待数据并杀死它

      ssh -oStrictHostKeyChecking=no -i <key> username@hostname "yarn top" | head -5 | grep -w 'Applications' | awk '{print "Pending_apps" "\t" $7}' >> test.txt & PID=$!; sleep 1; kill -s SIGINT $PID
      

      希望 ssh 传输 SIGINT 成功

      【讨论】:

      • 在后台运行命令时仍然无法进入命令提示符。您能否告诉我如何使用上述 ssh 命令将输出发送到 test.txt 并返回到命令提示符。