如何使用超时在终端上显示命令输出

如何使用超时在终端上显示命令输出

如果我dd if=/dev/zero of=/dev/null这样做,就会在终端上显示结果。但我想在特定的时间内运行此命令并显示结果。例如,我尝试过

timeout 10s dd if=/dev/zero of=/dev/nul但我在终端上没有得到 stdout / stderr 。

我尝试使用一些超时选项,例如“--preserve-status”、“--foreground”和“-v --verbose”,但终端上仍然没有输出。

有没有办法让我的结果显示在终端上,甚至显示在文件中?

答案1

--foreground将选项 for与signal to timeout结合使用。INTdd

timeout --foreground -s INT 0.1 dd if=/dev/zero of=/dev/null

文档timeout说:

--foreground
  when not running timeout directly from a shell prompt,
  allow COMMAND to read from the TTY and get TTY signals;
  in this mode, children of COMMAND will not be timed out

从我所看到的痕迹等看来,这对于dd.无需--foreground进程获取INT信号但随后CONT两者dd都会timeout迅速导致进程退出。在极少数情况下,dd确实有时间处理INT信号,但这不是常态。

永远不会--foreground发送CONTdd在退出之前有时间打印统计信息。

上面链接的函数cleanup在第一次迭代调用时被调用sigsuspend

ddsprocess_signals()极少被称为 interrupt_signalCONT在处理时设置timeout(即--foreground未设置)。

答案2

如果要dd在 stderr 上显示 的输出(例如使用 中断dd进程Ctrl+C),请使用 SIGINT 信号而不是默认的 SIGTERM:

timeout -s INT 10s dd if=/dev/zero of=/dev/null

要将 stderr 重定向到 file logfile,请使用

timeout -s INT 10s dd if=/dev/zero of=/dev/null 2> logfile

答案3

尝试这个:

timeout -s INT --foreground 10s dd if=/dev/zero of=/dev/null

相关内容