Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/apache-flex/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在tcl中搜索一个数字,即进程id并终止进程id_Tcl - Fatal编程技术网

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

如何在tcl中搜索一个数字,即进程id并终止进程id,tcl,Tcl,我试图搜索存储在变量(比如缓冲区)中的进程id I-e 6762 执行上述代码时出现以下错误 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_S

我试图搜索存储在变量(比如缓冲区)中的进程id I-e 6762


执行上述代码时出现以下错误

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) 错误#args:应为“foreach varList?varList list…?命令” 执行时 foreach行[拆分$Buffer“\n”]{ (步骤“测试SNMP陷阱”第21行) 从内部调用 “测试\u SNMP\u陷阱” (文件“/SNMP_TRY.tcl”第46行)
如何搜索进程id并正确销毁它?

几乎正确。您需要一个空格来分隔第一个和第二个参数。 另外,我会将第一个\d更改为\d+,因为您可能有9个以上的背景工作

if {[regexp {\[\d+\]\s+(\d+)} $line junk pid]}
另外,
[info exists…]
作用于变量,而不是值:

[info exists pid]
编辑:添加最终代码片段的示例

foreach
行中缺少空格。如果未附加
语句,则
{
正文前需要有空格

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语句也可以(更好):


如果你想杀死它

try {
    exec sh -c "kill -0 $pid && kill $pid"
} on error e {
    puts "could not kill $pid: $e"
}

kill-0$pid
只是一个测试,看看这样一个pid是否正在运行。

在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
    }
}

我几乎没有做任何更改;只是添加了一些空格和大括号。

上面代码片段的一些问题:

  • 缺行连续字符
  • 缺少收盘报价
  • 信息存在应在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"
}

我已经执行了nohup tcpdump-ni eth0-s02>&1以下错误,执行上述代码时出错了#args:在执行从“Test_SNMP_Trap”(文件“/SNMP_TRY.tcl”第46行调用的“foreach line[split$Buffer”\n”{(过程“Test_SNMP_Trap”第21行)时,应该是“foreach varList?varList?varList…?command”
foreach line [split $buffer "\n"]{
    if {[regexp {\[\d\]\s+(\d+)}$line junk pid]}
       break
}
foreach line [split $buffer "\n"] {
    if {[regexp {\[\d\]\s+(\d+)} $line junk pid]} {
        break
    }
}
foreach line [split $buffer "\n"] \
{
    if {[regexp {\[\d\]\s+(\d+)} $line junk pid]} \
    {
        break
    }
}

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