免费注册 查看新帖 |

Chinaunix

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

[系统管理] 如何获取管道中某个进程的pid? [复制链接]

论坛徽章:
1
15-16赛季CBA联赛之福建
日期:2016-06-02 02:13:58
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2016-03-08 04:58 |只看该作者 |倒序浏览
本帖最后由 muphil 于 2016-03-08 14:19 编辑

我是shell新手,下面的问题请各位多多指教:
我有个命令需要把输出pipe到另一个命令中,并且要在后台执行,为了在这个脚本退出的时候,为了使那个cmd正常退出,我需要知道它的pid,另外这个pid还要用于后续指令,问题是,如何如何能正确获取?
比如:
  1. #!/bin/sh
  2. pid=''
  3. int() {
  4.     [ -n "$pid" ] && kill -2 $pid
  5. }
  6. trap int 1 2 3 15
  7. (cmd | tee out) &
  8. #other commands (might make use of $pid)
复制代码
我试过:
a. (cmd & pid=$!) | tee out &
这样做因为那条赋值在subshell里,外面捕捉不到
b. (cmd & echo $! > cmd.pid) | tee out &
pid=`cat cmd.pid`
这样确实可以,但是我这个脚本需要可以同时执行多个,所以可能需要把cmd.pid名字里加上改成随机数之类的,但我感觉这样做很蹩脚,应该有更好的方法吧。

另外:由此引发我的另一个问题,我就在这一起问了吧,其实最开始的时候我尝试的是:
c. cmd | tee out &
   pid=$!
1)按C-c退出脚本时,'tee out'进程退出了,但是cmd进程还在运行
2)如果单独运行,cmd | tee out &, 按C-c中断命令,cmd是正常退出的
我理解的是正常情况下,'tee out'退出时,cmd会接收到SIGPIPE,默认退出。
然而脚本中kill -2给'tee out'发送SIGINT应该等价于按C-c。
请问2)中cmd是如何正常退出的?1)那种情况为何不行?二者区别在哪?

论坛徽章:
84
每日论坛发贴之星
日期:2015-12-29 06:20:00每日论坛发贴之星
日期:2016-01-16 06:20:00每周论坛发贴之星
日期:2016-01-17 22:22:00程序设计版块每日发帖之星
日期:2016-01-20 06:20:00每日论坛发贴之星
日期:2016-01-20 06:20:00程序设计版块每日发帖之星
日期:2016-01-21 06:20:00每日论坛发贴之星
日期:2016-01-21 06:20:00程序设计版块每日发帖之星
日期:2016-01-23 06:20:00程序设计版块每日发帖之星
日期:2016-01-31 06:20:00数据库技术版块每日发帖之星
日期:2016-01-16 06:20:00程序设计版块每日发帖之星
日期:2016-01-16 06:20:00程序设计版块每日发帖之星
日期:2016-01-14 06:20:00
2 [报告]
发表于 2016-03-08 10:10 |只看该作者
cmd > >(tee out) &
pid=$!

论坛徽章:
1
15-16赛季CBA联赛之福建
日期:2016-06-02 02:13:58
3 [报告]
发表于 2016-03-08 10:39 |只看该作者
回复 2# yjh777
多谢提供解答,不过我想尽量只使用posix shell中的特性。

论坛徽章:
1
15-16赛季CBA联赛之福建
日期:2016-06-02 02:13:58
4 [报告]
发表于 2016-03-08 11:10 |只看该作者
我有一个想法,就是在脚本前面选择某个目录构造个类似于/proc/*/fd/ 的目录结构,用来存储我这个脚本进程相关的信息。不知shell中有没有提供现成的这种进程独立的信息存储机制。

论坛徽章:
84
每日论坛发贴之星
日期:2015-12-29 06:20:00每日论坛发贴之星
日期:2016-01-16 06:20:00每周论坛发贴之星
日期:2016-01-17 22:22:00程序设计版块每日发帖之星
日期:2016-01-20 06:20:00每日论坛发贴之星
日期:2016-01-20 06:20:00程序设计版块每日发帖之星
日期:2016-01-21 06:20:00每日论坛发贴之星
日期:2016-01-21 06:20:00程序设计版块每日发帖之星
日期:2016-01-23 06:20:00程序设计版块每日发帖之星
日期:2016-01-31 06:20:00数据库技术版块每日发帖之星
日期:2016-01-16 06:20:00程序设计版块每日发帖之星
日期:2016-01-16 06:20:00程序设计版块每日发帖之星
日期:2016-01-14 06:20:00
5 [报告]
发表于 2016-03-08 14:43 |只看该作者
貌似没有
    临时文件,命名管道 ,,,

不像多年前 bash 已经事实标准了,努力写posix标准的shell,还不如在你维护的平台普及 ksh bash (ksh 是bash超集)

论坛徽章:
1
15-16赛季CBA联赛之福建
日期:2016-06-02 02:13:58
6 [报告]
发表于 2016-03-08 15:28 |只看该作者
问题1解决了
mkdir -p "$tmpdir"
(cmd & echo $! > "$tmpdir/$$" ) | tee out &
pid=`cat "$tmpdir/$$"
问题2,C-c是向process group 发送SIGINT, 只给pipe中一个进程发SIGINT不够。
kill -2 -$$, 这样等价于C-c,
不过貌似cmd还是不退出,我尝试
kill -15 -$$, 却可以,难道C-c是向process group发送SIGTERM?
stty -a | grep '\^C'显示的是intr,即SIGINT。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP