Модераторы: korob2001, ginnie
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Получить вывод ошибок из другого процесса 
:(
    Опции темы
artem78
Дата 15.5.2015, 18:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 4
Регистрация: 15.5.2015

Репутация: нет
Всего: нет



Как можно получить вывод STDERR процесса sendmail в переменную? Решение нужно для Windows.

Код

    sub send_by_sendmail {
        my $self = shift;
        my $return;
        if ( @_ == 1 and !ref $_[0] ) {
            ### Use the given command...
            my $sendmailcmd = shift @_;
            Carp::croak "No sendmail command available" unless $sendmailcmd;
    
            ### Do it:
            local *SENDMAIL;
            open SENDMAIL, "|$sendmailcmd" or Carp::croak "open |$sendmailcmd: $!\n";
            $self->print( \*SENDMAIL );
            close SENDMAIL;
            $return = ( ( $? >> 8 ) ? undef: 1 );
        } else {    ### Build the command...
            my %p = $self->_unfold_stupid_params(@_);
    
            $p{Sendmail} = $SENDMAIL unless defined $p{Sendmail};
    
            ### Start with the command and basic args:
            my @cmd = ( $p{Sendmail}, @{ $p{BaseArgs} || [ '-t', '-oi', '-oem' ] } );
    
            # SetSender default is true
            $p{SetSender} = 1 unless defined $p{SetSender};
    
            ### See if we are forcibly setting the sender:
            $p{SetSender} ||= defined( $p{FromSender} );
    
            ### Add the -f argument, unless we're explicitly told NOT to:
            if ( $p{SetSender} ) {
                my $from = $p{FromSender} || ( $self->get('From') )[0];
                if ($from) {
                    my ($from_addr) = extract_full_addrs($from);
                    push @cmd, "-f$from_addr" if $from_addr;
                }
            }
    
            ### Open the command in a taint-safe fashion:
            my $pid = open SENDMAIL, "|-";
            defined($pid) or die "open of pipe failed: $!\n";
            if ( !$pid ) {    ### child
                exec(@cmd) or die "can't exec $p{Sendmail}: $!\n";
                ### NOTREACHED
            } else {          ### parent
                $self->print( \*SENDMAIL );
                close SENDMAIL || die "error closing $p{Sendmail}: $! (exit $?)\n";
                $return = 1;
            }
        }
        return $self->{last_send_successful} = $return;
    }

PM   Вверх
arto
Дата 16.5.2015, 11:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1495
Регистрация: 31.10.2004

Репутация: 38
Всего: 40



perldoc IPC::Run3 IPC::Run ?
PM MAIL ICQ   Вверх
artem78
Дата 16.5.2015, 14:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 4
Регистрация: 15.5.2015

Репутация: нет
Всего: нет



Если сделать вот так, процесс намертво виснет.

Код
local (*WRITER, *READER, *ERROR);
my $pid = open3(\*WRITER, \*READER, \*ERROR, $sendmailcmd);
$self->print( \*WRITER ); # Отправка письма sendmail-у

my $errors = '';
while (my $errout = <ERROR>) {
    $errors .= $errout;
}

waitpid( $pid, 0 ) or die "$!\n";
if ($? >> 8) {
    $return = undef;
    #
    # делаю что-нибудь с переменной $errors ...
    #
} else {
    $return = 1;
}


Это сообщение отредактировал(а) artem78 - 16.5.2015, 14:50
PM   Вверх
arto
Дата 17.5.2015, 14:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1495
Регистрация: 31.10.2004

Репутация: 38
Всего: 40



что именно вы хотели сделать этим кодом?
PM MAIL ICQ   Вверх
Loki
Дата 6.6.2015, 13:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 244
Регистрация: 9.7.2006

Репутация: нет
Всего: нет



попробуй IO::Capture::Stderr
иил вот так в файл

open(STDERR,">/tmp/err.log"); 
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Perl"
korob2001
sharq
  • В этом разделе обсуждаются общие вопросы по языку Perl
  • Если ваш вопрос относится к системному программированию, задавайте его здесь
  • Если ваш вопрос относится к CGI программированию, задавайте его здесь
  • Интерпретатор Perl можно скачать здесь ActiveState, O'REILLY, The source for Perl
  • Справочное руководство "Установка perl-модулей", можно скачать здесь


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, korob2001, sharq.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Perl: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0733 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.