【问题标题】:Start a command, and then send data to it启动命令,然后向其发送数据
【发布时间】:2013-11-03 17:24:17
【问题描述】:

我正在开发一个小实用工具,它可以解析一些文件,提取特定信息,然后将其存储到 mongodb 集合中。

它现在正在工作,但它正在做类似的事情:

#!/bin/bash

find myFolder | while read f
do
    # some things
    ...
    # and then

    echo "db.test.insert({'val': BinData(0, '$data')});" | mongo -quiet --host 127.0.0.1:36427 collectionName
done

但这里的“问题”是我每次都在打开/关闭 mongodb 连接。
那么问题来了:

有没有办法启动 mongodb 连接,然后将一些数据写入其中。

我知道下面的代码是完全错误的,但这只是为了给你一个我正在寻找的功能的例子:

#!/bin/bash

mongoConn=`mongo 127.0.0.1:36427 collectionName`

find myFolder | while read f
    # ...

    echo "db.test.insert(..);" > mongoConn
done

echo "exit;" > mongoConn

【问题讨论】:

  • 命名管道可以工作,它是文件夹中的一个特殊文件,其工作方式类似于管道。您可能希望防止 mongodb 在读取单个文件后关闭,因此stackoverflow.com/questions/5957386/… 可能会有所帮助。

标签: bash shell unix


【解决方案1】:

以下假设您可以将多个命令写入您的 mongo 工具。

打开一个管道到 mongo 命令作为标准输出。之后你就可以编写你的命令了。

exec > >(mongo ...)
find ... | while read ... ; do
  echo "db.test.insert(...);"
done

【讨论】:

  • 完美!正是我想要的。我不知道>(...)。我只是将您的代码更改为使用exec 3> >(mongo ...),然后使用echo "db..." >&3 :)
  • 您应该知道这是 bashish --- 即,特定于 bash 的扩展 --- 并且不能在标准 Posix shell 中工作。这不是问题,但您需要确保脚本顶部的魔法直接调用 bash (#!/bin/bash) 而不是默认 shell (#!/bin/sh),因为默认 shell 可能不是 bash。
  • 这里不需要进程替换。只需将 while 循环的输出通过管道传输到 mongo: find ...| while read ...; do ...; done | mongo ...
  • @chepner 是的,它是对的,但没有太大区别。
【解决方案2】:

你可以试试这样的:

#!/bin/bash

deleteTmpFile(){
    [[ -f insert.tmp ]] && rm -rf $1
}

tmpFile="insert.tmp"
deleteTmpFile $tmpFile

find ... | while read f
do
    #...
    echo "db.test.insert({'val': BinData(0, '$data')});" >> $tmpFile
done

cat insert.tmp|mongo -quiet --host 127.0.0.1:36427 collectionName
deleteTmpFile $tmpFile

【讨论】:

  • 问题是这是一个非常漫长的过程。它解析大量数据,因此我无法存储命令列表。我需要现场直播。
  • 您可以交换文件的内容:排空 tmp 文件并在 mongodb 上运行管道,例如每 50 次查询。否则使用另一种语言,它提供了允许我们使用持久连接的工具。
猜你喜欢
  • 2017-11-21
  • 2010-11-14
  • 2011-03-22
  • 1970-01-01
  • 1970-01-01
  • 2011-08-25
  • 2012-06-26
  • 2015-08-24
  • 1970-01-01
相关资源
最近更新 更多