免费注册 查看新帖 |

Chinaunix

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

如何跟踪shell脚本里面管道前后的PID? [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2008-06-12 11:00 |只看该作者 |倒序浏览
大致是下面这样的情况:
   
program -argv -argv …… |  egrep '……' |  logger -p local0.notice

希望实现的功能是长期执行一个程序,将其输出进行实时过滤,再将过滤出来的有用信息传递给logger记录到syslog里面去。现在想要这段东西搞成标准daemon的样子,先是用
start-stop-daemon  --start  -b -p /var/log/pid.pid -m --exec  program  -- -argv -argv …… |  egrep '……' |  logger -p local0.notice  
来做,但是好像不能将管道符后面的部分当作参数传递,也就是说start-stop-daemon只将 argv -argv ……  传给了program;于是就把命令放进一个shell文件里, 于是就成了
##shell_to_run_program

#!/bin/bash

program -argv -argv .....  | egrep '......'  | logger -p local0.notice
###end shell_to_run_program




start-stop-daemon  -b -p /var/log/pid.pid -m --start --exec  shell_to_run_program
。但是这样在pid文件里得到的是调用脚本的shell自身的pid,而非program的pid,这样一来,执行 start-stop-daemon --stop -p /var/log/pid.pid 的时候就无法结束掉program以及后面的logger了。请问哪位有办法跟踪到 program的pid呢?

论坛徽章:
8
摩羯座
日期:2014-11-26 18:59:452015亚冠之浦和红钻
日期:2015-06-23 19:10:532015亚冠之西悉尼流浪者
日期:2015-08-21 08:40:5815-16赛季CBA联赛之山东
日期:2016-01-31 18:25:0515-16赛季CBA联赛之四川
日期:2016-02-16 16:08:30程序设计版块每日发帖之星
日期:2016-06-29 06:20:002017金鸡报晓
日期:2017-01-10 15:19:5615-16赛季CBA联赛之佛山
日期:2017-02-27 20:41:19
2 [报告]
发表于 2008-06-12 11:26 |只看该作者
/etc/rc.d/init.d/中都是shell脚本,咋就能正常start stop呢?

论坛徽章:
0
3 [报告]
发表于 2008-06-12 12:20 |只看该作者

回复 #2 waker 的帖子

因为它们是在脚本内通过start-stop-daemon调用单进程的程序(或是自己管理fork的程序),而我说的这个是用start-stop-daemon调用一个shell脚本程序,且这个脚本程序产生了多个进程,使用了管道,并且没有管理这些进程。结果是, start-stop-daemon 得到的是调用脚本的Shell的pid(比如 65000),而脚本里执行的program是65001,第一个管道符后面的egrep是65002,第二个管道符后面的logger是65003。如果我想用start-stop-daemon得来的pid,kill掉program,显然是不行的,因为这个脚本执行后完后,65000自己就结束了,留下了65001、65002、65003在后台工作,我真正要的是kill掉65001。

[ 本帖最后由 急不通 于 2008-6-12 12:54 编辑 ]

论坛徽章:
8
摩羯座
日期:2014-11-26 18:59:452015亚冠之浦和红钻
日期:2015-06-23 19:10:532015亚冠之西悉尼流浪者
日期:2015-08-21 08:40:5815-16赛季CBA联赛之山东
日期:2016-01-31 18:25:0515-16赛季CBA联赛之四川
日期:2016-02-16 16:08:30程序设计版块每日发帖之星
日期:2016-06-29 06:20:002017金鸡报晓
日期:2017-01-10 15:19:5615-16赛季CBA联赛之佛山
日期:2017-02-27 20:41:19
4 [报告]
发表于 2008-06-12 14:54 |只看该作者

回复 #3 急不通 的帖子

通常 kill -1 -65000就可以了,65001、65002、65003都会收到SIG1

论坛徽章:
0
5 [报告]
发表于 2008-06-12 17:01 |只看该作者

回复 #4 waker 的帖子

我这里的现实情况是:kill了65000之后,65001还在运行。只有用暴力了, start-stop-daemon -q --stop -n program

论坛徽章:
8
摩羯座
日期:2014-11-26 18:59:452015亚冠之浦和红钻
日期:2015-06-23 19:10:532015亚冠之西悉尼流浪者
日期:2015-08-21 08:40:5815-16赛季CBA联赛之山东
日期:2016-01-31 18:25:0515-16赛季CBA联赛之四川
日期:2016-02-16 16:08:30程序设计版块每日发帖之星
日期:2016-06-29 06:20:002017金鸡报晓
日期:2017-01-10 15:19:5615-16赛季CBA联赛之佛山
日期:2017-02-27 20:41:19
6 [报告]
发表于 2008-06-12 17:03 |只看该作者

回复 #5 急不通 的帖子

-65000和65000不一样的

论坛徽章:
0
7 [报告]
发表于 2008-06-13 09:53 |只看该作者

回复 #6 waker 的帖子

试了一下,确实可以哦。谢谢了!
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP