期待等待 - 直到生成的程序完成
Waiting on expect - until spawned program completes
我正在尝试使用 expect 在 perl 的自动化脚本中生成一个程序。
我正在尝试决定如何等待这个程序完成,因为
- 我不能依赖任何字符串匹配,因为程序与其退出方式不一致
- 我想等待直到看到用户提示并且用户获得控制权。
有没有什么方法可以在不对用户提示执行正则表达式的情况下做到这一点?我可以依赖的任何标志或退出代码告诉用户现在可以控制。
谢谢
没有说明 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
),因为在处理程序中回收了进程。
我正在尝试使用 expect 在 perl 的自动化脚本中生成一个程序。
我正在尝试决定如何等待这个程序完成,因为 - 我不能依赖任何字符串匹配,因为程序与其退出方式不一致 - 我想等待直到看到用户提示并且用户获得控制权。
有没有什么方法可以在不对用户提示执行正则表达式的情况下做到这一点?我可以依赖的任何标志或退出代码告诉用户现在可以控制。
谢谢
没有说明 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
),因为在处理程序中回收了进程。