我尝试搜索存储在变量 say 缓冲区中的进程 id i-e 6762
nohup tcpdump -ni eth0 -s0 2>&1 </dev/null &
[1] 6762
You have new mail in /var/mail/root
如果匹配的话我想杀死它。
我尝试过以下代码:
foreach line [split $buffer "\n"]{
if {[regexp {\[\d\]\s+(\d+)}$line junk pid]}
break
}
if {[info exists $pid]} {
puts "PID of nohup is $pid"
}
执行上述代码时出现以下错误
wrong # args: should be "foreach varList list ?varList list ...? command"
while executing
"foreach line [split $Buffer "\n"]{"
(procedure "Test_SNMP_Trap" line 21)
invoked from within
"Test_SNMP_Trap"
(file "./SNMP_TRY.tcl" line 46)
我怎样才能搜索进程ID然后正确地销毁它?
几乎是对的。您需要一个空格来分隔第一个参数和第二个参数。
另外,我会将第一个 \d 更改为 \d+,因为您总是有可能拥有超过 9 个后台作业。
if {[regexp {\[\d+\]\s+(\d+)} $line junk pid]}
Also [info exists ...]
作用于变量,而不是值:
[info exists pid]
编辑:添加最终代码片段的示例
中缺少一个空格foreach
线。前面需要有一个空格{
。和身体if
未附上声明。
Tcl 中的解析器的工作方式与某些其他语言不同。行延续和空格很重要。
所以最终的代码将如下所示:
foreach line [split $buffer "\n"] {
if { [regexp {\[\d+\]\s+(\d+)} $line junk pid] } \
break
}
if { [info exists pid] } {
puts "PID of nohup is $pid"
}
if 语句也可以是(更好):
if { [regexp {\[\d+\]\s+(\d+)} $line junk pid] } {
break
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)