bash 脚本可以监控程序在屏幕上打印的内容吗?

bash 脚本可以监控程序在屏幕上打印的内容吗?

所以问题源于互联网连接速度慢,并且当我尝试运行“apt-get update”时遇到问题(debian)。 apt-get 会拉取 4 个小块数据,并尝试拉取 1 个大块数据,大约 5 分钟后完成 25%,它会放弃大块下载,转而尝试获取更大的替代数据。 5 分钟后,完成 20% 时它放弃,转而尝试另一个更大的替代方案,5 分钟后,完成 10% 时它放弃并抱怨无法获得所需的东西。如果我尝试再次运行“apt-get update”,它会再次拉下 4 个小块,并从其离开的位置依次继续处理 3 个大块。我尝试过研究和使用 apt 的 http::Timeout 和 ftp::Timeout 设置,但似乎没有设置可以处理这种情况。我目前的做法是在 apt 转到替代方案时照顾这个并按 ctrl-c,以避免每次尝试额外浪费 10 分钟。我希望能够让它自己照顾孩子。

我想到的是一个 shell 脚本,大致如下:

启动超时,sudo apt-get update,如果任何时候 apt-get 成功完成,则立即继续运行 sudo apt full-upgrade 并最终退出,但与此同时,如果 apt-get 在屏幕上打印一行以文本“Ign:”,然后 pkill apt,如果过期时间不到 30 分钟,则从 sudo apt-get update 重新开始,否则 echo“Apt-update 此时无法完成!”并退出。

我想知道的是,bash 脚本真的可以做这样的事情吗?如果是,那么有关开始查找的命令的提示将会有所帮助。我认为 apt-get 的检查和运行必须在两个进程中进行,但我不知道一个进程如何检查另一个进程的屏幕输出和退出状态。如果 bash 脚本不能做到这一点,那么我不知道我应该看什么其他工具,Python 可以做到吗?

答案1

你在这里有一个复杂的问题。

  1. 脚本可以监视程序在屏幕上打印的内容吗?

是的,strace可以做到这一点。

strace -p<process id> -s1000 -e write

这将监视属于进程 id 的进程正在写入的内容,将输出从默认的 32 个字符增加到 1000 个字符。

  1. 当命令输出一些字符串时你能做一些事情吗?

这非常简单,应该能让您朝着正确的方向前进。

<command-you-want-to-watch> | tee file_to_watch

tee将输出到屏幕以及文件。尽管如此,您可能不会在屏幕上看到通常发生的一些奇特的覆盖。如果您不关心观看,可以将输出重定向到文件<command> >file

观察者脚本:

#!/bin/bash

while true; do
  if grep -q "phrase1" file_to_watch; then
    #do stuff
    break
  fi

  if grep -q "phrase2" file_to_watch; then
    #do stuff
    break
  fi

  sleep 1
done

这将每秒检查一次文件中的短语,做任何你喜欢的事情,然后结束(这些break语句是杀死无限循环的原因)

相关内容