Bash在后台运行一个函数

时间:2014-04-29 17:11:57

标签: linux bash function background

这里有一个相对简单的问题。我需要在bash的后台运行一个函数。通常我会这样做:

FUNCTION &

但事情有点复杂。我有以下行来运行文本数据库中每个记录的main函数。我无法真正编辑这些代码而不会大幅改变整个项目的其余部分,但我仍然对新想法持开放态度。

cat databases/$WAN | grep -v \# | while read LINE; do MAIN; done

我想在后台为每个记录生成一个新终端,以进行一种并行类型处理,使事情变得更快。主要需要一分钟来处理每条记录。然而,这不起作用。

cat databases/$WAN | grep -v \# | while read LINE; do MAIN &; done

有什么建议吗?

*更新*

感谢所有回复。让我看看我是否可以回答其中的一些问题。

gniourf_gniourf - 是的我知道用这样的猫是错的。这是早期和关键代码,所以我还没有更新它。我现在读到了我做的大多数事情的while循环。我最终会解决它。你可能对语法很正确。当我这样分解时,事情似乎现在起作用了:

  cat databases/$WAN | grep -v \# | while read LINE
  do
    MAIN & > /dev/null 2>&1
  done

这样可以解决背景问题。我想知道在我的单行语法中搞砸了什么。感谢

chepner - 我不相信LINE是一个变量。我可能错了。关于Bash的一些事情仍然让我困惑。也许它是并且是一个变量,来自数据库的整个记录​​在处理之前被存储起来。

Bruce K - Waiting正是我想要避免的。如果我让它一次在同一个终端中运行,它将按顺序缓慢处理每个记录。如果我将每个记录推送到一个单独的终端进行处理,所有记录将同时处理(至少在我们看来)。额外的开销是有意的,以加快数据库循环的速度。

基数 - 是的,你是对的。我会读到这个。感谢您的链接。

1 个答案:

答案 0 :(得分:1)

这对我有用:

$ function testt(){ echo "lineee is <$lineee>";}
$ grep 5432 /etc/services|while read lineee;do testt&done
lineee is <postgres     5432/udp                        # POSTGRES>
lineee is <postgres     5432/tcp                        # POSTGRES>

如果由于某种原因,您的MAIN功能没有看到LINE变量,您可以尝试:

&#34;出口&#34; LINE变量事先:

$ export LINE
$ # do your thing

或者,将读取的行作为参数传递给函数:

$ function testt(){ LINE="$1"; echo "LINE is <$LINE>";}
$ grep 5432 /etc/services|while read LINE;do testt "$LINE"&done