【问题标题】:Waiting on expect - until spawned program completes等待期望 - 直到生成的程序完成
【发布时间】:2019-04-11 11:52:11
【问题描述】:

我正在尝试使用 expect 在 perl 的自动化脚本中生成一个程序。

我正在尝试决定如何等待这个程序完成,因为 - 我不能依赖任何字符串匹配,因为程序与其退出方式不一致 - 我想等待,直到看到用户提示并且用户获得控制权。

是否有任何方法可以在不执行用户提示的正则表达式的情况下做到这一点?我可以依赖的任何标志或退出代码告诉用户现在可以控制。

谢谢

【问题讨论】:

  • 你能澄清你的第一句话吗?您是在使用 perl 的期望,还是普通的 Tcl 期望和生成的程序是在 perl 中实现的?你真的需要这个任务的期望吗?
  • 是的,我正在使用 perl 的期望。生成的程序/任务基本上是远程存储库的 git 克隆。现在我无法准确判断克隆过程何时完成以及是否可以继续执行其余的自动化脚本
  • 如果没有交互为什么要使用Expect?程序“inconsistent”如何——除了退出之外,还有什么其他方法可以完成?

标签: regex perl unix exit expect.pm


【解决方案1】:

没有说明Expect 的其他用途,或者程序如何指示其退出。

假设在某一时刻交互停止,我们只等待程序退出,你可以使用expect(undef)

use warnings;
use strict;
use feature 'say';

use Expect;

my $cmd = 'ls -l ./ | head -5; sleep 3';

my $exp = Expect->spawn( $cmd );
say "Started process ", $exp->pid;   

$exp->raw_pty(1);
$exp->log_stdout(0);
# ...

$exp->expect(undef);
say "Program exited with status ", $exp->exitstatus;

say $exp->before;

如果在程序单独运行后没有预期输出,请移除 before

另一种方法是设置$SIG{CHLD} 信号处理程序,您可以在其中检查程序的 PID 并设置一个标志,然后其他代码可以检查。 PID 在一个变量中,需要在处理程序之前声明,然后在进程启动后使用pid 方法设置,因此在处理程序中使用是合法的(在strict 下),并且设置为当处理程序运行。

那么exitstatus 就没有用了 (-1),因为进程是在处理程序中收获的。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-07-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-01-03
    • 1970-01-01
    相关资源
    最近更新 更多