Chinaunix

标题: 如何跟踪shell脚本里面管道前后的PID? [打印本页]

作者: 急不通    时间: 2008-06-12 11:00
标题: 如何跟踪shell脚本里面管道前后的PID?
大致是下面这样的情况:
   
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呢?
作者: waker    时间: 2008-06-12 11:26
/etc/rc.d/init.d/中都是shell脚本,咋就能正常start stop呢?
作者: 急不通    时间: 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 编辑 ]
作者: waker    时间: 2008-06-12 14:54
标题: 回复 #3 急不通 的帖子
通常 kill -1 -65000就可以了,65001、65002、65003都会收到SIG1
作者: 急不通    时间: 2008-06-12 17:01
标题: 回复 #4 waker 的帖子
我这里的现实情况是:kill了65000之后,65001还在运行。只有用暴力了, start-stop-daemon -q --stop -n program
作者: waker    时间: 2008-06-12 17:03
标题: 回复 #5 急不通 的帖子
-65000和65000不一样的
作者: 急不通    时间: 2008-06-13 09:53
标题: 回复 #6 waker 的帖子
试了一下,确实可以哦。谢谢了!




欢迎光临 Chinaunix (http://bbs.chinaunix.net/) Powered by Discuz! X3.2