Expect脚本里我想完成这个功能,提示错误“child process exited abnormally”,请教。

sh/bash/dash/ksh/zsh等Shell脚本
回复
chengmoYS
帖子: 125
注册时间: 2007-10-22 22:40

Expect脚本里我想完成这个功能,提示错误“child process exited abnormally”,请教。

#1

帖子 chengmoYS » 2011-04-11 16:21

在Expect脚本中,我想把系统当前进程中的corosync进程个数查询出来,并且赋值给一个变量corosync_count,请问该如何使用Tcl实现。
当corosync进程存在时,就使用kill -9杀掉这些进程。

# 检测当前系统进程中是否存在corosync的进程,并且把进程数赋值给corosync_count
set corosync_count [ exec ps -ef | grep 'corosync' | grep -v 'grep' | wc -l ]

# 如果进程数大于0,即存在corosync进程
if { $corosync_count > 0 } {

### 返回corosync的pid列
set corosync_pid [ exec ps -ef | grep 'corosync' | grep -v 'grep' | awk "{print \$2}" ]

### 遍历corosync_pid列表,杀死进程
foreach i $corosync_pid {
exec kill -9 $i
}



执行返回为
child process exited abnormally
while executing
"exec ps -ef | grep 'corosync' | grep -v 'grep' | awk "{print \$2}" "
chengmoYS
帖子: 125
注册时间: 2007-10-22 22:40

Re: Expect脚本里我想完成这个功能,提示错误“child process exited abnormally”,

#2

帖子 chengmoYS » 2011-04-11 16:31

corosync进程运行的时候,在shell中查询如下

[root@localhost Desktop]# ps -ef | grep 'corosync' | grep -v 'grep' | awk '{print $2}'
2280

在expect中查询如下

expect1.1> set cp [ exec ps -ef | grep 'corosync' | grep -v 'grep' | awk "{print \$2}" ]
6934

为啥不一样呢?
fnan
帖子: 919
注册时间: 2009-07-01 22:04

Re: Expect脚本里我想完成这个功能,提示错误“child process exited abnormally”,

#3

帖子 fnan » 2011-04-11 22:56

kose5@kose5-Aspire-4552:~$ cat t2.exp
#!/usr/bin/expect

set t9_sh_count [exec pgrep -c t9.sh]
if $t9_sh_count>0 {
set t9_sh_id [exec pgrep t9.sh]
send_tty "$t9_sh_id\n"
foreach i $t9_sh_id {
exec kill -9 $i
}
send_tty "已删除进程。\n"
exit
}
kose5@kose5-Aspire-4552:~$ pgrep t9.sh
14241
14242
kose5@kose5-Aspire-4552:~$ ./t2.exp
14241
14242
已删除进程。
kose5@kose5-Aspire-4552:~$ ./t2.exp
0
child process exited abnormally
while executing
"exec pgrep -c t9.sh"
invoked from within
"set t9_sh_count [exec pgrep -c t9.sh]"
(file "./t2.exp" line 3)
kose5@kose5-Aspire-4552:~$
没问题,只是当无t9.sh进程时,如何消除child process exited abnormally。。。等消息?
bash不如perl精妙,学不到lisp的皮毛,远不够c++强悍,不过可以用。
fnan
帖子: 919
注册时间: 2009-07-01 22:04

Re: Expect脚本里我想完成这个功能,提示错误“child process exited abnormally”,

#4

帖子 fnan » 2011-04-12 5:52

#变通一下ok了:
kose5@kose5-Aspire-4552:~$ cat t2.exp
#!/usr/bin/expect

set t9_sh_count [exec ps ax | grep -c t9.sh]
if $t9_sh_count>1 {
set t9_sh_id [exec pgrep t9.sh]
send_tty "$t9_sh_id\n"
foreach i $t9_sh_id {
exec kill -9 $i
}
send_tty "已删除进程。\n"
exit
}
if $t9_sh_count==1 {
send_tty "无 t9.sh 进程\n"
exit
}
kose5@kose5-Aspire-4552:~$ ./t2.exp
无 t9.sh 进程
kose5@kose5-Aspire-4552:~$
bash不如perl精妙,学不到lisp的皮毛,远不够c++强悍,不过可以用。
chengmoYS
帖子: 125
注册时间: 2007-10-22 22:40

Re: Expect脚本里我想完成这个功能,提示错误“child process exited abnormally”,

#5

帖子 chengmoYS » 2011-04-12 9:30

谢谢3楼的同志。

我再看看你的代码。

好像是进程存在就没有错误,进程不存在的时候反而是有错误的。
看看catch。

你能加点注释吗。让大家好理解点。
chengmoYS
帖子: 125
注册时间: 2007-10-22 22:40

Re: Expect脚本里我想完成这个功能,提示错误“child process exited abnormally”,

#6

帖子 chengmoYS » 2011-04-12 16:43

解决如下,

### corosync进程存在,corosync_exist为0
### corosync进程不存在,corosync_exist为1

### 检测当前系统中corosync进程是否存在
set corosync_exist [ catch { exec ps -ef | grep "corosync" | grep -v "grep" | wc -l } ]

### 如果当前系统中corosync进程存在
if { $corosync_exist== 0 } {
### 存在,就把corosync进程赋值给corosync_pid
set corosync_pid [ exec ps -ef | grep "corosync" | grep -v "grep" | awk "{print \$2}" ]
### 杀死corosync_pid进程
foreach i $corosync_pid {
exec kill -9 $i
}
}
fnan
帖子: 919
注册时间: 2009-07-01 22:04

Re: Expect脚本里我想完成这个功能,提示错误“child process exited abnormally”,

#7

帖子 fnan » 2011-04-13 19:25

谢谢提示catch,学脚本不久,未到全面学指令阶段.
改进如下:
#!/usr/bin/expect

# 检察是否有t9.sh进程,pgrep对进程过滤,由于无匹配进程时catch返回1,所以检察进程总数变为多余,不加-c选项。
set t9_sh_count [catch {exec pgrep "t9.sh"}]
if $t9_sh_count==0 {
# 有进程时catch返回0,此时用pgrep检察所有匹配进程id号,用pgrep只为减少指令数量。
set t9_sh_id [exec pgrep t9.sh]
# 显示检察到的进程id。
send_tty "$t9_sh_id\n"
# 删除所有进程。
foreach i $t9_sh_id {
exec kill -9 $i
}
send_tty "已删除进程。\n"
exit
}
# 无进程时显示。
if $t9_sh_count==1 {
send_tty "无 t9.sh 进程\n"
exit
}
bash不如perl精妙,学不到lisp的皮毛,远不够c++强悍,不过可以用。
chengmoYS
帖子: 125
注册时间: 2007-10-22 22:40

Re: Expect脚本里我想完成这个功能,提示错误“child process exited abnormally”,

#8

帖子 chengmoYS » 2011-04-14 8:09

Expect我虽然看了段时间,但是其实也不太会用。只是工作中有时用到。有空可以多交流。我最近又遇到一个其他问题。由于环境问题所以没有在论坛提出来。

哦 我也学到一个新命令pgrep,以前没怎么用过。 感觉省去了awk,提取pid的时候。
chengmoYS
帖子: 125
注册时间: 2007-10-22 22:40

Re: Expect脚本里我想完成这个功能,提示错误“child process exited abnormally”,

#9

帖子 chengmoYS » 2011-04-14 8:23

加个吧,把那个问题问问你。我的msn是[email protected]
fnan
帖子: 919
注册时间: 2009-07-01 22:04

Re: Expect脚本里我想完成这个功能,提示错误“child process exited abnormally”,

#10

帖子 fnan » 2011-04-14 10:08

chengmoYS 写了:加个吧,把那个问题问问你。我的msn是[email protected]
不好意思,我从不用通讯软件,win的lin的都没有。 :em06
bash不如perl精妙,学不到lisp的皮毛,远不够c++强悍,不过可以用。
chengmoYS
帖子: 125
注册时间: 2007-10-22 22:40

Re: Expect脚本里我想完成这个功能,提示错误“child process exited abnormally”,

#11

帖子 chengmoYS » 2011-04-14 10:35

哦 什么都不用 感叹
回复