shell高手请进,救命!

blueflame 2003-12-13 09:48:28
应用背景:在终端上运行A程序,进程A fork出A1和B1两个进程,
这段shell目的是要从/test/list文件夹中读取以终端名命名的文件(如:tty1a、tty2a),其中每个文件中的内容对应为在相应终端上运行的A程序的进程号(父进程),然后kill掉父进程A及其子进程A1和B1。

我目前遇到的问题是:该段代码运行到
pid1=`cat $uptty/$ans`
ps -ef|awk -F' ' -v ppid=$pid1 -e '$3 == ppid {print "kill -9 "$2}'
kill -9 $pid1
部分时,有时正常,有时则不正常(尤其是放在程序循环中区做时尤为明显),表现为运行A程序的终端“死”在那里,该shell程序停滞没有反应,感觉似乎与CPU的运行时间片分配有关,请教各位高手到底是怎么回事?该如何解决?谢谢!

uptty=/test/list

if [ "$1" ] #参数$1为终端名.
then
ans="$1"
else
echo "请输入终端号: \c"
read ans
fi

while [ $ans ]
do
if [ ! -s $uptty/$ans ]
then
dispactive
else
echo "正在处理...\c"
#
# get the pid from the active file and kill the process.
#
pid1=`cat $uptty/$ans`
ps -ef|awk -F' ' -v ppid=$pid1 -e '$3 == ppid {print "kill -9 "$2}'
kill -9 $pid1
echo "..\c"
……

...全文
50 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
lyatcsdn 2003-12-17
  • 打赏
  • 举报
回复
这个shell脚本没什么难度,kill -9不一真能完全杀死进程,特别是在有网络资源(如NFS)的使用时更是如此。
建议用信号处理方法解决。
在A中设置某个信号的处理,方法详见*NIX信号处理。fork后Al与Bl会继承该处理(也可再改成其它处理方法)。shell脚本不要发送9号信号,而发送A中设置的信号,分别给A、Al和Bl,它们收到信号后会执行信号处理。信号处理中应有资源释放等动作,然后自己退出。这样做更干净合理。

试一试,祝你好运!!!
chenzhangf 2003-12-17
  • 打赏
  • 举报
回复
先用ps -ax查看你要杀的进程名,用killall name(name为进程名)杀。
blueflame 2003-12-17
  • 打赏
  • 举报
回复
这种方法我知道的,只是我不太搞得懂为何kill -9 不一定能完全杀死进程,而且最要命的是有时执行到kill -9指令时就退出整个脚本回到shell提示符状态了,我对此很不解,为何会这样的?
blueflame 2003-12-15
  • 打赏
  • 举报
回复
re:rexp(沧浪客)
如果是存在有各终端处于disable状态,而各终端上“运行”的程序全由某一终端控制台(如tty04)运行的程序来创建相应进程去实现呢?譬如说一些银行的系统
rexp 2003-12-14
  • 打赏
  • 举报
回复
为什么不在ps中增加-t来指定tty,用-C选项来指定进程名呢?
vcppman 2003-12-13
  • 打赏
  • 举报
回复
试试
#!/usr/bin/csh
set PID = ps -ef|awk -F' ' -v ppid=$pid1 -e '$3 == ppid {print $2}'
kill -9 P${PID}

我怀疑是你新开了一个sh去持行他出的什么问题!
blueflame 2003-12-13
  • 打赏
  • 举报
回复
sorry,刚才编辑
ps -ef|awk -F' ' -v ppid=$pid1 -e '$3 == ppid {print "kill -9 "$2}'
行时不小心删掉了|/bin/sh
应为:
ps -ef|awk -F' ' -v ppid=$pid1 -e '$3 == ppid {print "kill -9 "$2}'|/bin/sh

23,121

社区成员

发帖
与我相关
我的任务
社区描述
Linux/Unix社区 应用程序开发区
社区管理员
  • 应用程序开发区社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧