Ожидание по ожидаемому - пока не завершится созданная программа - PullRequest
0 голосов
/ 08 ноября 2018

Я пытаюсь использовать ожидаемую программу в скрипте автоматизации на Perl.

И я пытаюсь решить, как ожидать завершения этой программы, так как - Я не могу полагаться на совпадение строк, так как программа не соответствует тому, как она выходит - Я хотел бы подождать, пока пользователь увидит приглашение и пользователь не получит контроль.

Есть ли способы сделать это без выполнения регулярного выражения в приглашении пользователя? Любые флаги или коды выхода, на которые я могу положиться, которые говорят, что пользователь теперь имеет контроль.

Спасибо

1 Ответ

0 голосов
/ 08 ноября 2018

Не указано, для чего еще используется 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), поскольку процесс обрабатывается в обработчике.

...