Tcl 使用Expect生成的程序太多

Tcl 使用Expect生成的程序太多,tcl,expect,Tcl,Expect,我正在使用expect模块执行任务 这是我的代码示例 foreach temp $list { spawn -X $temp while {1} { expect { eof {break} "password {send "password\r"} "\]" {send "exit\r"} } } } 脚本在1071计数器后中断。带着错误 too man

我正在使用expect模块执行任务

这是我的代码示例

foreach temp $list {
    spawn -X $temp

    while {1} {
        expect {
            eof {break}
            "password {send "password\r"}
            "\]"      {send "exit\r"}
        }
    }
}
脚本在1071计数器后中断。带着错误

too many programs spawned? could not create pipe: too many file open while executing "spawn ssh -X ..." 产生了太多的程序?无法创建管道:打开的文件太多 执行时
“spawn ssh-X…”听起来像是我遇到的类似问题。
您是否尝试过ulimit-a并检查了进程或文件?

听起来像是我遇到的类似问题。
您是否尝试过ulimit-a并检查了进程或文件?

可以同时生成的程序数量限制相对较低(这取决于您的系统支持的虚拟终端数量;实际上,我很惊讶您的虚拟终端数量超过了1000个…)所以,一旦完成了这些旧程序,您就需要收获它们(Expect在退出时会收获所有东西,但在这里它很重要,因为您要比它快得多)。更重要的是,限制将取决于系统上的其他情况,因为虚拟终端实际上是一个系统全局资源

要在完成旧程序后收获它,请将
wait
添加到循环末尾(当然,假设您不希望子流程继续超过循环末尾),以获得以下结果:

foreach temp $list {
    spawn -X $temp

    while {1} {
        expect {
            eof {break}
            "password" {send "password\r"}
            "\]"       {send "exit\r"}
        }
    }

    wait               ;#### <<<<<----- THIS!!!
}

同时生成的程序数量限制相对较低(这取决于您的系统支持的虚拟终端数量;事实上,我很惊讶您的虚拟终端数量超过了1000个……),因此,一旦完成这些旧程序,您就需要收获它们(Expect在退出时会收获一切,但在这里它很重要,因为您的时间比这要快得多)。此外,限制将取决于您的系统上发生的其他事情,因为虚拟终端实际上是一个系统全局资源

要在完成旧程序后收获它,请将
wait
添加到循环末尾(当然,假设您不希望子流程继续超过循环末尾),以获得以下结果:

foreach temp $list {
    spawn -X $temp

    while {1} {
        expect {
            eof {break}
            "password" {send "password\r"}
            "\]"       {send "exit\r"}
        }
    }

    wait               ;#### <<<<<----- THIS!!!
}

感谢您的回复。但我仍然面临同样的问题。我还注意到spawn ssh正在位置/dev/null/创建一个无法关闭的文件描述符。由于最大限制是1024(使用ulimit-a检查),因此当它超过该限制时,抛出错误“生成的程序太多?无法创建管道:执行“伙伴”时打开的文件太多我希望得到解决方案只需在Donals建议的等待后添加
code
close$spawn\u id
code
,我当前的代码看起来像
code
foreach temp$list{spawn-X$temp while{1}{expect{eof{break}密码{send“password\r”}]{send“exit\r”}}等待;捕获{close$spawn_id};}感谢您的回复。但我仍然面临同样的问题。我还注意到spawn ssh正在位置/dev/null/创建一个无法关闭的文件描述符。由于最大限制是1024(使用ulimit-a检查),因此当它超过该限制时,抛出错误“生成的程序太多?无法创建管道:执行“伙伴”时打开的文件太多我希望得到解决方案只需在Donals建议的等待后添加
code
close$spawn\u id
code
,我当前的代码看起来像
code
foreach temp$list{spawn-X$temp while{1}{expect{eof{break}密码{send“password\r”}]{send“exit\r”}}等待;捕获{close$spawn_id};}