Хочу сделать сабж, чтобы можно было определить отсутствие связи и прочие проблемы, произошедшие с ssh.
Однонаправленный вариант работает нормально ($proga на сервере получает данные):
$pid = open(RECV, "| -");
$SIG{ALRM} = sub { die "whoops, program pipe broke" };
if($pid)
{
 print RECV "blablabla" || die ("Can't send data!\n");
 close(RECV) || die ("SSH exited $?");
 exit 0;
}
else
{#child
 ($EUID, $EGID) = ($UID, $GID);
 exec("/usr/bin/ssh $user\@$server $proga 2>/dev/null") || die "can't exec program: $!";
}
Самый страшный двунаправленный вариант, который придумался - вот такой (данные получает шелл пользователя $user):
pipe(PR, CW);
pipe(CR, PW);
$pid = fork();
$SIG{ALRM} = sub { dielog("ssh pipe broke"); };
if ($pid)
{#parent
 close PR; close PW;
 print CW "blablabla" || dielog("can't send data");
 close(CW) || dielog("ssh exited $?");                         
 close(CR) || dielog("ssh exited $?") ;
 waitpid($pid,0);                       
 exit 0;
}
else
{#child
 dielog("cannot fork: $!") unless defined $pid;
 close CR; close CW;
 open(STDOUT,">&PW"); close PW;
 open(STDIN,"<&PR"); close PR;
 ($EUID, $EGID) = ($UID, $GID);
 my $server = "$ssh $user\@server 2>/dev/null";
 exec($server) || dielog("can't exec $server: $!");
}
Вот этот вариант успешно завершается даже при попытке послать данные на несуществующий сервер (левый ip-шник).
Что я делаю не так? Существует ли более элегантное решение? Мне важно, чтобы скрипт прерывался при любых проблемах со связью.

    
      Ответ на:
      
          комментарий
        от vilfred 
  
    
      Ответ на:
      
          комментарий
        от Gelin 
  
    
        Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.
      
Похожие темы
- Форум смена EUID в perl-скрипте (2003)
 - Форум вопрос о правах доступа. (2009)
 - Форум Задание на Stepik по Perl. Никак не могу понять, где загвоздка. HELP. (2020)
 - Форум Perl + FastCGI + nginx (2009)
 - Форум [perl] прога плодит зомби (2008)
 
- Форум Perl. Сокеты. (2007)
 - Форум сегфолт в perl gtk2, которого раньше не было (2014)
 - Форум perl ssh2 в 1 сессию (2008)
 - Форум Буфер вывода в Perl - как отключить? (вывод от wine) (2012)
 - Форум Непонятные тормоза в паренте после fork (2005)