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

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

使用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数据的明显损失的提示将不胜感激.

问候,

阿兰.

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

  1. Linux C:管道的实现原理,命名管道

    目录 一.管道 二.利用管道将写进程和都进程连接起来 三.命名管道 一.管道 在Unix/Linux 中 命令行 cmd1  |  cmd2                #例如    history ...

  2. 命名管道(FIFO) Linux进程进程间的通信之命名管道(FIFO)

    Linux进程进程间的通信之命名管道(FIFO) 命名管道(FIFO),它和一般的管道一样.都是作为中间的邮递员来实现两个进程间的通信交流. 命名管道(FIFO)有几个特点: 1.命名管道(FIFO) ...

  3. 匿名管道(pipe)和命名管道(mkfifo)

    匿名管道(pipe)和命名管道(mkfifo) 进程间通信必须通过内核提供的通道. 1.匿名管道 匿名管道通过打开的文件描述符来标识的.--用于具有亲缘关系间进程之间的通信. int pipe(int ...

  4. mysql 的命名管道_笔记27-徐 SQLSERVER命名管道工作原理

    1 --SQLSERVER命名管道工作原理 2 --SQL首先在服务器上创建一个命名管道并监听之,然后客户端即连接到这个命名 3 --管道上来进行对话.对每一个客户端命名管道连接请求SQL都会创建一个 ...

  5. Linux中的pipe(管道)与named pipe(FIFO 命名管道)

    catalogue 1. pipe匿名管道 2. named pipe(FIFO)有名管道 1. pipe匿名管道 管道是Linux中很重要的一种通信方式,是把一个程序的输出直接连接到另一个程序的输入 ...

  6. linux pipe 命名管道,linux 进程学习笔记-named pipe (FIFO)命名管道

    与"无名管道"不同的是,FIFO拥有一个名称来标志它,所谓的名称实际上就是一个路径,比如"/tmp/my_fifo",其对应到磁盘上的一个管道文件,如果我们用f ...

  7. linux系统编程之管道(三):命名管道FIFO和mkfifo函数

    进程间通信必须通过内核提供的通道,而且必须有一种办法在进程中标识内核提供的某个通道,前面讲过的匿名管道是用打开的文件描述符来标识的.如果要互相通信的几个进程没有从公共祖先那里继承文件描述符,它们怎么通 ...

  8. linux 读取mic的数据,Linux管道音频文件到麦克风输入

    我正在寻找一种方法将文件中的音频数据输入麦克风,因此当第三方应用程序(例如arecord或Chromium的"按语音搜索"功能)使用麦克风进行音频输入时,它们会从文件中接收音频数据 ...

  9. linux列表去重复数据,Linux常用去除重复数据口令

    一.uniq干什么用的 文本中的重复行,基本上不是我们所要的,所以就要去除掉.linux下有其他命令可以去除重复行,但是我觉得uniq还是比较方便的一个.使用uniq的时候要注意以下二点 1,对文本操 ...

最新文章

  1. mysql中 课程1比课程2成绩高_小菜菜mysql练习解读分析1——查询 01 课程比 02 课程成绩高的学生的信息及课程分数......
  2. IT项目管理总结:第三章 项目管理过程组
  3. HDU 5968 异或密码(区间dp)
  4. 低功耗wifi soc_36氪首发研发低功耗蓝牙芯片,联睿微完成数千万元A+轮融资
  5. linux 限额系统,Linux磁盘限额(quota)
  6. 通讯框架 t-io 学习——给初学者的Demo:ShowCase设计分析
  7. Python学习 Day 2-数据类型和变量
  8. 机器学习笔记(一):机器的学习定义、导数和最小二乘 | 凌云时刻
  9. 地狱少女...._习惯累积沉淀_新浪博客
  10. abaqus盾构隧道建模实例_abaqus盾构施工模拟
  11. 隧道监控计算机网络系统方案,高速公路隧道监控系统解决方案
  12. 苹果越狱后怎么还原_iOS 软件证书失效怎么办?越狱后你可以这么做
  13. 微信小程序-轮播图实现
  14. Unity 卡在 Rload Script Assemblies
  15. 高效记录任务和提醒的极简ToDo待办事项便签应用
  16. Win10恢复照片查看器
  17. 【安卓】Android Studio 3.5的引用包错误
  18. depthimage-to-laserscan
  19. slice,split,splice的区别与用法
  20. android gif动态显示,Android 显示Gif 动态图片

热门文章

  1. 如何在Flutter(REST API)中进行API调用
  2. 使用LocalDate,LocalTime和LocalDateTime
  3. java对响应数据做封装_1000种对Java的响应没有死
  4. 坚实原则:接口隔离原则
  5. 主键能否@onetoone_双向@OneToOne主键关联
  6. 使用Dagger 2在GWT中进行依赖注入
  7. 适用于无服务器Java开发人员的AWS Lambda:它为您带来了什么?
  8. 使用Spring创建用于JUnit测试的JNDI资源
  9. 32和64位jvm_我应该使用32位还是64位JVM?
  10. 帮助推动Java EE向前发展