【问题标题】:How to run a program and kill the program using pipes如何使用管道运行程序并终止程序
【发布时间】:2019-08-01 16:51:42
【问题描述】:

我有一个交互式命令行程序,它在运行时会生成文本。我要做的是运行程序,通过 perl 正则表达式提取文本,然后终止程序。

/path/to/my/program | perl regex magic

到目前为止,我有上面的行。它启动程序并从程序的输出中提取文本。问题是在我提取文本后,/path/to/my/program 继续运行。我需要终止该进程,因为我不再需要它。我希望我的行看起来像下面的行:

/path/to/my/program | perl regex magic | terminate original process

其中原始进程是通过运行 /path/to/my/program 创建的进程

TLDR; 如何使用 bash 在同一行中启动一个进程并终止它?

我尝试将程序的输入模拟为 control-c (ascii 0x3),但它实际上输入了“^C”,而不是模拟我在键盘上物理按下 control c。

【问题讨论】:

  • 管道是异步的; programperl 同时运行,而不是一个接一个。您的第三个组件会同时启动,可能会在您的程序有机会做任何事情之前杀死您的程序。管道不是这里的答案。
  • ^C 没有输入任何程序;您的 终端 拦截它并将其解释为向当前前台进程组中的每个进程发送SIGINT 的请求。

标签: bash shell command-line


【解决方案1】:

问题是你怎么知道是时候终止进程了。如果给定的时间段足够,那么您可以:

timeout 30 /path/to/my/program | perl regex magic

【讨论】:

  • 有没有办法做到不超时?该命令在 Mac 上默认不可用,是的,我知道我可以安装它,但我正在构建一个工具,我不希望它有任何依赖项。
  • @andermoran: /path/to/my/program & sleep 30s; kill $!
  • 注意这三个命令都必须在一个命令组中执行,因为&; 都终止了一个管道。 { program & sleep 30s; kill $!; } | perl ....
【解决方案2】:
#!/bin/bash

while read -r line; do
  perl regex magic $line
  if <condition to kill>; then
    killall command
  fi
done< <(command)

这将逐行读取程序的输出,并允许您在每次打印一行时插入代码。您可以决定何时/如何退出 while 循环内部的逻辑中的某个位置。这不是管道而是.......

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-05-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多