我试图搜索存储在变量说缓冲区
中的进程id i-e 6762nohup 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然后正确销毁它?
答案 0 :(得分:1)
几乎是正确的。您需要一个空格来分隔第一个和第二个参数。 另外我会将第一个\ d更改为\ d +,因为总有可能有超过9个后台作业。
if {[regexp {\[\d+\]\s+(\d+)} $line junk pid]}
同样[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
}
答案 1 :(得分:0)
如果你想杀死它,
try {
exec sh -c "kill -0 $pid && kill $pid"
} on error e {
puts "could not kill $pid: $e"
}
kill -0 $pid
只是一个测试,看看这样的pid是否正在运行。
答案 2 :(得分:0)
在Tcl中放置空格和大括号非常重要,因为命令的每个单词都需要与所有其他单词正确分开,并且除非引用或转义它,否则命令行结束符号。
因此,您的代码:
foreach line [split $buffer "\n"]{
if {[regexp {\[\d\]\s+(\d+)}$line junk pid]}
break
}
有一个问题是第一行]
和{
之间没有空格,问题是}
和$
之间没有空格第二行,以及没有任何东西使第三行与第二行相关联的问题。让我们把它写成传统的Tcl:
foreach line [split $buffer "\n"] {
if {[regexp {\[\d\]\s+(\d+)} $line junk pid]} {
break
}
}
我几乎什么都没改变;只是添加了一些空格和一些大括号。
答案 3 :(得分:0)
上面代码段的一些问题:
尝试下面的代码段,看看是否有帮助:
foreach line [split $buffer "\n"] \
{
if {[regexp {\[\d\]\s+(\d+)} $line junk pid]} \
{
break
}
}
if {[info exists pid]} \
{
puts "PID of nohup is $pid"
}