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