如何在tcl中搜索一个数字,即进程id,并终止进程id

时间:2016-01-09 18:44:08

标签: tcl

我试图搜索存储在变量说缓冲区

中的进程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然后正确销毁它?

4 个答案:

答案 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)

上面代码段的一些问题:

  • 缺少续行字符
  • 缺少收尾报价
  • 信息存在应该在pid而不是$ pid

尝试下面的代码段,看看是否有帮助:

foreach line [split $buffer "\n"] \
{
    if {[regexp {\[\d\]\s+(\d+)} $line junk pid]} \
    {
        break
    }
}

if {[info exists pid]} \
{
    puts "PID of nohup is $pid"
}