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