【问题标题】:How do I stop the cat command when it's reading from an named pipe?从命名管道读取时如何停止 cat 命令?
【发布时间】:2020-01-25 11:11:58
【问题描述】:

我的命名管道获取数据非常缓慢但无休止,我想在它们到达时将命名管道的内容复制到日期格式的文件。

我有这样的事情

do
    cat /tmp/big_file > `printf '%(%Y/%m/%d)T' -1`.output &
    sleep 3590
    kill $!
    sleep 10
done

直接杀死cat 是否安全?或者我会在它的缓冲区中丢失一些数据吗?我如何告诉猫该停下来了?

【问题讨论】:

  • 最好使用while read 循环而不是cat
  • 我实际上正在发送到 aws s3,一个 Web 端点,所以我想保持标准输入或 aws cli 保持打开状态,以便我可以继续写信给它。如果它是一个文件,我可以逐行读取
  • 您无需关闭标准输入即可使用while read 方法。
  • 关闭管道的另一端;这将导致cat 在完成读取数据后退出。
  • 您可能想研究logrotate 之类的东西,而不是自己实现它。

标签: bash


【解决方案1】:

如果您不想使用while read,您也可以使用kill 发送信号,例如https://unix.stackexchange.com/questions/2107/how-to-suspend-and-resume-processes 默认情况下kill 发送SIGTERM。您还可以使用 C 或 shell 代码发送信号,例如 https://www.thegeekstuff.com/2011/02/send-signal-to-process/ 使用 SIGTSTP 暂停进程,SIGCONT 继续它,所有信号的列表在 http://man7.org/linux/man-pages/man7/signal.7.html

https://unix.stackexchange.com/questions/2107/how-to-suspend-and-resume-processes

https://unix.stackexchange.com/questions/149741/why-is-sigint-not-propagated-to-child-process-when-sent-to-its-parent-process中描述了一些陷阱

【讨论】:

  • 现在我想起来了,中断可能会在写入记录的过程中中断cat。如果我必须将行循环读入fifo,并通过时间戳检查来旋转文件,我想我只会使用python。不过,这有助于做出决定!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-12-16
  • 2012-11-25
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多