免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12下一页
最近访问板块 发新帖
查看: 4007 | 回复: 15
打印 上一主题 下一主题

求助,关于命令后台执行的问题。 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2009-01-08 16:57 |只看该作者 |倒序浏览
mkfifo a.fifo

read t <a.fifo
再重新打开一个shell输入
echo 11111 >a.fifo
第一个shell里可以获取到值。

可是为什么
read t<a.fifo &
放到后台执行。却无法获取这个值

论坛徽章:
0
2 [报告]
发表于 2009-01-08 17:12 |只看该作者
mkfifo a.fifo是对当前shell的,
read t<a.fifo &会启动在后台一个新的shell,前面的mkfifo a.fifo就起不了作用了

论坛徽章:
0
3 [报告]
发表于 2009-01-08 17:30 |只看该作者
我想让一段程序并发执行,然后保存其执行结果类似于下面的过程。

t=0
declare -a arry
while [ $t -lt 10]
do
   mkfifo $t.fifo
   read arry[$t] <$t.fifo
   (
       ping -c 2 $ip
       re=$?
      if [ $re -gt 0]
         echo "OK" >$t.fifo
      else
         echo "lost" >$t.fifo
    )&
    ((t++))
done

请问有什么好的方法吗?

论坛徽章:
0
4 [报告]
发表于 2009-01-09 15:50 |只看该作者
再重新顶起来。

论坛徽章:
0
5 [报告]
发表于 2009-01-09 16:50 |只看该作者
原帖由 jlu204 于 2009-1-8 16:57 发表
mkfifo a.fifo

read t a.fifo
第一个shell里可以获取到值。

可是为什么
read t

sanding:/home/sanding/network # read v < haha.fifo &
[1] 12113
sanding:/home/sanding/network # ps -o pid,ppid,command
PID  PPID  COMMAND
11901 11702 bash
12113 11901 bash
12114 11901 ps -o pid,ppid,command

放到后台,这个进程就变成了当前shell的子进程。其实已经read成功,但子进程变量在父进程中访问不到

[ 本帖最后由 jiayisuse 于 2009-1-9 16:51 编辑 ]

论坛徽章:
0
6 [报告]
发表于 2009-01-09 21:54 |只看该作者

回复 #5 jiayisuse 的帖子

明白了。

论坛徽章:
0
7 [报告]
发表于 2009-01-09 23:48 |只看该作者
lz 你的想法没有问题,子进程通过管道是能传递参数给父进程的(这是也是这种传递的一种方法),只是你的读写顺序和语法有问题而已

  1. # #!/bin/bash
  2. mkfifo t.fifo      
  3. t=0
  4. declare -a arry
  5. while [ $t -lt 5 ]
  6. do
  7.    (
  8.        r=$(($t%2))
  9.       if [ $r -eq 0 ]
  10.       then
  11.          echo "OK" > t.fifo
  12.       else
  13.          echo "lost" > t.fifo
  14.       fi
  15.     )&
  16. read arry[$t] < t.fifo
  17.      ((t++))
  18. done
  19. echo the arry is
  20. echo ${arry[*]}
  21. rm t.fifo
  22. exit 0
复制代码


  1. [rockfall@localhost tmp]$ ../kk.sh
  2. the arry is
  3. OK lost OK lost OK
复制代码


你code里的语法错误请自己找找

论坛徽章:
0
8 [报告]
发表于 2009-01-15 16:55 |只看该作者
不好意思。上边的代码我没执行过,我只是想说明我的问题临时写的一个东西。。而且还忘写了一个符号。

上周出差了。。没有机器调试。。


t=0
declare -a arry
while [ $t -lt 10 ]
do
   mkfifo $t.fifo
   read arry[$t] < $t.fifo &    #上面的代码忘了在这里加一个&号。。
   (
       ping -c 2 $ip
       re=$?
      if [ $re -gt 0]
         echo "OK" > $t.fifo
      else
         echo "lost" > $t.fifo
    )&
    ((t++))
done


如果按照haimming方法还是把mkfifo与read的位置换一下,并且在read arry[$t] <$t.fifo 后边加上&,还是无法取到值的。。~如果不加&。那这么写代码也就没什么意义了。。我只是想了解在多进程的情况下如何在子进程与父进程之间如何通信。

#!/bin/bash
mkfifo t.fifo      
t=0
declare -a arry
while [ $t -lt 5 ]
do
   (
       r=$(($t%2))
      if [ $r -eq 0 ]
      then
         echo "OK" > t.fifo
      else
         echo "lost" > t.fifo
      fi
    )&
read arry[$t] < t.fifo &     #注意这里有个小小的改动,如果不加&的话,read依然会等待前边的语句执行结束,这样就没什么意义了。
     ((t++))
done
echo the arry is
echo ${arry
  • }
    rm t.fifo
    exit 0

    再执行的时候数组就没有取到值
    ./tmp1.sh
    the arry is

    不知道还有没有其他的好办法可以用shell脚本使多个子进程与父进程之间通信。
  • 论坛徽章:
    1
    荣誉会员
日期:2011-11-23 16:44:17
    9 [报告]
    发表于 2009-01-15 17:43 |只看该作者

    回复 #8 jlu204 的帖子

    几点概念:
    1.用&就是在子进程中执行。
    2.子进程中的变量不能传回父进程。
    3.子进程可以使用FIFO传递信息给父进程。

    并发执行的进程必须放到后台去,这一点是对的。它要向父进程传递信息使用命名管道也没有问题。
    但是你读取FIFO的命令必须在当前shell下,否则读取的变量在父进程中无法访问到。
    你的脚本只需要做一点修改:
    读取FIFO的read命令移到并发执行的循环后面,并且——去掉“&”——这很重要!让它在当前shell下执行。
    然后你就可以访问读到的arry的内容了。

    论坛徽章:
    0
    10 [报告]
    发表于 2009-01-15 18:04 |只看该作者
    学习了 。。谢谢诸位大大。。
    您需要登录后才可以回帖 登录 | 注册

    本版积分规则 发表回复

      

    北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
    未成年举报专区
    中国互联网协会会员  联系我们:huangweiwei@itpub.net
    感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

    清除 Cookies - ChinaUnix - Archiver - WAP - TOP