use FileHandle; use IPC::Open2; use POSIX ":sys_wait_h"; my $server = "$ssh $user\@$server 2>/dev/null"; $SIG{ALRM} = sub { dielog("SIGALRM ssh pipe broke"); }; $SIG{PIPE} = sub { dielog("SIGPIPE ssh pipe broke"); }; $SIG{CHLD} = sub { while (waitpid(-1,WNOHANG) > 0) { dielog("child ssh exited $?") if $?>0; }; }; $pid = open2(*RECV,*SEND,$server) || dielog("can't exec $server"); SEND->autoflush(1); print SEND "blablabla" || dielog("can't send data"); #передаем close(SEND) || dielog("ssh exited $?"); $buf = <RECV>; #принимаем close(RECV) || dielog("ssh exited $?"); waitpid($pid,0);
Здесь нет задачи особенно синхронизировать прием/передачу -
все происходит последовательно.
Сильно подозреваю, что можно обойтись и без обработчиков SIGALRM и SIGPIPE,
но пусть будут на всякий случай.
Функция dielog аварийно завершает работу скрипта,
но перед этим пишет сообщение в системный лог.