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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Запуск всех скриптов Perl кроме самого себя, в многопоточном режиме 
:(
    Опции темы
Suppir
Дата 25.3.2014, 11:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Добрый день!

В директории 20 скриптов Perl, их нужно последовательно запускать. Я написал скрипт-пускач, который будет запускать остальные скрипты (кроме себя) в многопоточном режиме.

Код

use threads;
use Thread::Queue;

my $q = Thread::Queue->new();

if ($0 =~ /.+\\(.+)/){$myname = $1}

while(<*.pl>){
    $q -> enqueue($_) if $_ ne $myname;
}

my $thread_limit = 2; 

my @thr = map {
    threads->create(sub {
        while (defined (my $item = $q->dequeue_nb())){
            print "$item\n";
            system($item);
        }
    });
} 1..$thread_limit;
$_->join() for @thr;



Проблема в следующем. Все скрипты выдают какую-то информацию в консоль. И сейчас в консоли "пускача" отображается какая-то белиберда - запускаемые скрипты пишут свою информацию внахлест.

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

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


Эксперт
***


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

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



Можно.
PM MAIL   Вверх
Suppir
Дата 25.3.2014, 11:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Как? smile
PM MAIL   Вверх
Romikgy
Дата 25.3.2014, 11:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Любитель-программер
****


Профиль
Группа: Участник Клуба
Сообщений: 7326
Регистрация: 11.5.2005
Где: Porto Franco Odes sa

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



переведи вывод в файл 


--------------------
Владение русской орфографией это как владение кунг-фу — истинные мастера не применяют его без надобности. 
smile

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


Опытный
**


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

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



STDOUT, что-ли?


Ну, я добавил:
Код

open(STDOUT, ">$0.log");


Теперь вместо консоли пишет в файл. Но мне нужно, чтобы пускач писал в консоли, какие именно скрипты он запустил.

Это сообщение отредактировал(а) Suppir - 25.3.2014, 11:43
PM MAIL   Вверх
Bulat
Дата 25.3.2014, 12:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


татарский Нео
***


Профиль
Группа: Завсегдатай
Сообщений: 1701
Регистрация: 22.3.2006
Где: Альметьевск

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



Цитата(Suppir @  25.3.2014,  11:42 Найти цитируемый пост)
Но мне нужно, чтобы пускач писал в консоли, какие именно скрипты он запустил.


Код

#!/usr/bin/perl

print $0, "\n";





--------------------
менеджер по кодеврайтингу  smile 
PM MAIL WWW   Вверх
Suppir
Дата 25.3.2014, 12:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Куда это прописать?

Менять вывод всех 20 скриптов нет возможности. Нужно именно в пуске все прописать. 
PM MAIL   Вверх
Bulat
Дата 25.3.2014, 12:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


татарский Нео
***


Профиль
Группа: Завсегдатай
Сообщений: 1701
Регистрация: 22.3.2006
Где: Альметьевск

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



Suppir, считается, что

Код

            print "$item\n";
            system($item);


вот этот print и делает то, что тебе нужно. Но делает ли он это или нет у тебя - не знаю!

Добавлено через 9 минут и 5 секунд
Попробуй закомментировать строку 

Код

system($item);


и посмотри что будет писаться в консоли.


--------------------
менеджер по кодеврайтингу  smile 
PM MAIL WWW   Вверх
Romikgy
Дата 25.3.2014, 12:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Любитель-программер
****


Профиль
Группа: Участник Клуба
Сообщений: 7326
Регистрация: 11.5.2005
Где: Porto Franco Odes sa

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



Код

print "$item\n";
            system($item." > log.txt");


Это сообщение отредактировал(а) Romikgy - 25.3.2014, 12:50


--------------------
Владение русской орфографией это как владение кунг-фу — истинные мастера не применяют его без надобности. 
smile

PM   Вверх
Suppir
Дата 25.3.2014, 12:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Romikgy, 

из нескольких потоков не может писать в один log.txt, т.к. "файл заблокирован другим процессом".





Добавлено @ 12:56
Цитата(Bulat @ 25.3.2014,  12:31)
Suppir, считается, что

Код

            print "$item\n";
            system($item);


вот этот print и делает то, что тебе нужно. Но делает ли он это или нет у тебя - не знаю!

Добавлено @ 12:40
Попробуй закомментировать строку 

Код

system($item);


и посмотри что будет писаться в консоли.

Я закомментировал строку и получается следующее:
1) не пишется название запущенных скриптов;
2) выводится в консоль та информация, которую выдают запущенные скрипты.

И мне нужно ровно наоборот - чтобы информация от скриптов (что, что в скриптах прописано через Print) не выводилась в консоль и чтобы отображались названия запущенных скриптов. 


Это сообщение отредактировал(а) Suppir - 25.3.2014, 12:57
PM MAIL   Вверх
Bulat
Дата 25.3.2014, 13:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


татарский Нео
***


Профиль
Группа: Завсегдатай
Сообщений: 1701
Регистрация: 22.3.2006
Где: Альметьевск

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



Цитата(Suppir @  25.3.2014,  12:54 Найти цитируемый пост)
Я закомментировал строку и получается следующее:
1) не пишется название запущенных скриптов;
2) выводится в консоль та информация, которую выдают запущенные скрипты.


или ты сделал не то, что я тебе написал, или ты врешь!

Код

system($item);


запускает твои скрипты - если ты эту строку закомментировал(а не что-то другое), то у тебя скрипты вообще не должны были бы запускаться!  smile

Добавлено через 1 минуту и 43 секунды
Цитата(Romikgy @  25.3.2014,  12:47 Найти цитируемый пост)
            system($item." > log.txt");


а если 

Код

system($item." > $item.txt");


??


--------------------
менеджер по кодеврайтингу  smile 
PM MAIL WWW   Вверх
Suppir
Дата 25.3.2014, 13:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Bulat, я закомментировал строки 
Код

#            print "$item\n";
#           system($item." > log.txt");


Сейчас скрипт выглядит так:

Код

use threads;
use Thread::Queue;

my $q = Thread::Queue->new();

if ($0 =~ /.+\\(.+)/){$myname = $1}

while(<*.pl>){
    $q -> enqueue($_) if $_ ne $myname;
}

my $thread_limit = 2; 

my @thr = map {
    threads->create(sub {
        while (defined (my $item = $q->dequeue_nb())){
#            print "$item\n";
#           system($item." > log.txt");
            system($item);
        }
    });
} 1..$thread_limit;
$_->join() for @thr;



Он работает неправильно: в консоль перенаправляется вывод со всех скриптов (вперемешку), а названия запущенных скриптов не отображаются.

Добавлено через 1 минуту
Понятно, что если закомментировать
Код

system($item);

, то ни один скрипт вообще не запустится.

Добавлено через 2 минуты и 58 секунд
Цитата(Bulat @  25.3.2014,  13:00 Найти цитируемый пост)
а если 

код Perl
1:
system($item." > $item.txt");
?? 



Ну, получится 20-лог файлов с именами скриптов. Но дело в том, что и сейчас эти 20 скриптов создают 20-лог файлов с различной информацией. Зачем мне еще что-то писать.

Нужно только запускать параллельно эти 20 скриптов и выводить в консоль, какие скрипты запущены - вот и все. 
PM MAIL   Вверх
Bulat
Дата 25.3.2014, 13:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


татарский Нео
***


Профиль
Группа: Завсегдатай
Сообщений: 1701
Регистрация: 22.3.2006
Где: Альметьевск

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



Suppir, вообще-то я тебе писал совсем другое, но по закону Мерфи...  smile 

Код

use threads;
use Thread::Queue;
my $q = Thread::Queue->new();
if ($0 =~ /.+\\(.+)/){$myname = $1}
while(<*.pl>){
    $q -> enqueue($_) if $_ ne $myname;
}
my $thread_limit = 2; 
my @thr = map {
    threads->create(sub {
        while (defined (my $item = $q->dequeue_nb())){
            print "$item\n";
#           system($item." > log.txt");
#            system($item);
        }
    });
} 1..$thread_limit;
$_->join() for @thr;


Так можно проверить вывод в консоль названия запускаемых скриптов,

Если оное происходит - значит то, что ты хочешь уже делается! Нужно лишь маленько изменить сам запуск скриптов!  smile 

Это сообщение отредактировал(а) Bulat - 25.3.2014, 13:13


--------------------
менеджер по кодеврайтингу  smile 
PM MAIL WWW   Вверх
Suppir
Дата 25.3.2014, 13:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Bulat, 

если оставить строчку
Код

print "$item\n";


то в консоль выводятся названия скриптов. Это правильно.

Проблема в другом. Если мы запустим скрипты строчкой

Код

system($item);


то эти скрипты начинают наперебой  писать свою информацию в консоль пускача. То есть запускаемые потоки передают свой STDOUT в консоль пускача. Переделывать все скрипты нет возможности. Нужно отредактировать пускач таким образом, чтобы он отображал только названия запускаемых скриптов и не выводит их STDOUT в свою консоль.
PM MAIL   Вверх
Bulat
Дата 25.3.2014, 13:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


татарский Нео
***


Профиль
Группа: Завсегдатай
Сообщений: 1701
Регистрация: 22.3.2006
Где: Альметьевск

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



если ось юниксовая, то попробуй

Код

system($item." > /dev/null");


P.S. я больше предпочитаю форки, но вроде как и с тредами должно работать!  smile 


--------------------
менеджер по кодеврайтингу  smile 
PM MAIL WWW   Вверх
Страницы: (3) Все [1] 2 3 
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Perl"
korob2001
sharq
  • В этом разделе обсуждаются общие вопросы по языку Perl
  • Если ваш вопрос относится к системному программированию, задавайте его здесь
  • Если ваш вопрос относится к CGI программированию, задавайте его здесь
  • Интерпретатор Perl можно скачать здесь ActiveState, O'REILLY, The source for Perl
  • Справочное руководство "Установка perl-модулей", можно скачать здесь


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

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


 




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


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

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