linux 进城 管道丢数据,linux – 使用命名管道与bash – 数据丢失的问题

有人在线搜索,发现简单的“教程”使用命名管道.但是,当我做任何后台工作时,我似乎失去了大量的数据.

[[编辑:找到一个更简单的解决方案,看到回复帖子.所以我提出的问题现在是学术性的 – 万一有人想要一个工作服务器]]

使用Ubuntu 10.04与Linux 2.6.32-25-generic#45-Ubuntu SMP Sat Oct 16 19:52:42 UTC 2010 x86_64 GNU / Linux

GNU bash,版本4.1.5(1)-release(x86_64-pc-linux-gnu).

我的bash功能是:

function jqs

{

pipe=/tmp/__job_control_manager__

trap "rm -f $pipe; exit" EXIT SIGKILL

if [[ ! -p "$pipe" ]]; then

mkfifo "$pipe"

fi

while true

do

if read txt

then

echo "$(date +'%Y'): new text is [[$txt]]"

if [[ "$txt" == 'quit' ]]

then

break

fi

fi

done

}

我在后台运行它:

> jqs&

[1] 5336

现在我喂它了

for i in 1 2 3 4 5 6 7 8

do

(echo aaa$i > /tmp/__job_control_manager__ && echo success$i &)

done

输出不一致.

我经常得不到所有的成功回响.

我得到最多的新的文本回声成功回声,有时较少.

如果我删除’&’从’feed’,它似乎工作,但我被阻止,直到输出被读取.因此,我想让子进程被阻止,但不是主进程.

目的是编写一个简单的作业控制脚本,所以我最多可以并行运行10个作业,并排队休息以备后续处理,但可靠地知道它们运行.

全职工作经理如下:

function jq_manage

{

export __gn__="$1"

pipe=/tmp/__job_control_manager_"$__gn__"__

trap "rm -f $pipe" EXIT

trap "break" SIGKILL

if [[ ! -p "$pipe" ]]; then

mkfifo "$pipe"

fi

while true

do

date

jobs

if (($(jobs | egrep "Running.*echo '%#_Group_#%_$__gn__'" | wc -l) < $__jN__))

then

echo "Waiting for new job"

if read new_job

then

echo "new job is [[$new_job]]"

if [[ "$new_job" == 'quit' ]]

then

break

fi

echo "In group $__gn__, starting job $new_job"

eval "(echo '%#_Group_#%_$__gn__' > /dev/null; $new_job) &"

fi

else

sleep 3

fi

done

}

function jq

{

# __gn__ = first parameter to this function, the job group name (the pool within which to allocate __jN__ jobs)

# __jN__ = second parameter to this function, the maximum of job numbers to run concurrently

export __gn__="$1"

shift

export __jN__="$1"

shift

export __jq__=$(jobs | egrep "Running.*echo '%#_GroupQueue_#%_$__gn__'" | wc -l)

if (($__jq__ '

then

eval "(echo '%#_GroupQueue_#%_$__gn__' > /dev/null; jq_manage $__gn__) &"

fi

pipe=/tmp/__job_control_manager_"$__gn__"__

echo $@ >$pipe

}

调用

jq

jq abc 2 sleep 20

将开始一个过程.

那部分工作正常.开始第二个,罚款.

一个接一个的手似乎工作正常.

但是,在一个循环中,10开始似乎失去了系统,就像上面的更简单的例子.

任何关于我能够做的解决IPC数据的明显损失的提示将不胜感激.

问候,

阿兰.

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值