【问题标题】:Bash: stopping and filtering result processBash:停止和过滤结果过程
【发布时间】:2017-03-02 10:43:04
【问题描述】:

如果我使用 xterm 启动两个终端,我想知道当终端 1 的结果显示我想要什么时,如何过滤并停止终端 2 上的进程。

示例:终端 1 是一个活动进程,内部有一些结果 终端 2 也作为活动进程启动,并且在终端 1 上得到我想要的结果之前不会停止

如果活动终端 1 结果显示我想要什么,终端 2 将立即停止。

我该怎么做?

谢谢。

【问题讨论】:

  • [心灵感应技能激活:]在学期#1启动的应用程序完成工作并退出时,您需要关闭学期#2窗口,对吗?
  • 你能说清楚你的 termimal 2 是做什么的吗?你只会在它上面运行一个知道/不知道的程序,还是很多知道/不知道的程序?您的第 2 学期的程序需要以交互方式启动还是可以在后台启动?
  • Terminal 2 是一个交互式命令,term1 和 2 之间没有特定的联系,但是 term2 的 timelife 取决于 term1。例如,如果 term1 显示“test succesfull”,则不再需要 term2 .

标签: bash process command


【解决方案1】:

一种简单的方法是将术语 1 输出写入文件,然后从术语 2 中搜索您的模式。

1号航站楼

您可以使用script 将您的shell 记录到一个文件中。

$ script --flush -c program_to_monitor /path/to/log/file #e.g. /tmp/term1.log

2号航站楼

此脚本在第 1 期日志文件中持续搜索您的模式,如果找到,它会向第 2 期中的所有进程发送 SIGTERM,如果这些进程在 $delay 之后仍然存在,则发送 SIGKILL。

kill_tty.sh:(可能有一些关于 ps 的 BSD 警告)

#!/usr/bin/env bash
tty=$(tty)
delay=2
while true; do
  if grep "your_pattern" $term1_log 2>/dev/null ; then
    ps h -o pid --tty ${tty#/*/} | xargs kill #soft way
    sleep ${delay}s
    ps h -o pid --tty ${tty#/*/} | xargs -9 kill #hard way
  fi
done

然后在后台启动它

$ ./kill_tty.sh /path/to/log/file &

--
我确信它们是更好的方法,但它确实有效。

【讨论】:

    【解决方案2】:

    最终通过不同的方式解决问题,从我需要的命令中创建一个直到循环并使用

    接收 PID
    echo $! >/tmp/mypid.pid
    

    然后用

    杀死它
    kill `cat /tmp/mypid.pid`
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-06-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多