| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > Perl: Общие вопросы > Запуск всех скриптов Perl кроме самого себя |
| Автор: Suppir 25.3.2014, 11:22 | ||
| Добрый день! В директории 20 скриптов Perl, их нужно последовательно запускать. Я написал скрипт-пускач, который будет запускать остальные скрипты (кроме себя) в многопоточном режиме.
Проблема в следующем. Все скрипты выдают какую-то информацию в консоль. И сейчас в консоли "пускача" отображается какая-то белиберда - запускаемые скрипты пишут свою информацию внахлест. Подскажите, можно ли отредактировать пускач таким образом, чтобы он только показывал названия запущенных скриптов и не выводил при этом информацию, которую пишут в консоль эти запускаемые скрипты? |
| Автор: tzirechnoy 25.3.2014, 11:30 |
| Можно. |
| Автор: Suppir 25.3.2014, 11:31 |
| Как? |
| Автор: Romikgy 25.3.2014, 11:41 |
| переведи вывод в файл |
| Автор: Suppir 25.3.2014, 11:42 | ||
| STDOUT, что-ли? Ну, я добавил:
Теперь вместо консоли пишет в файл. Но мне нужно, чтобы пускач писал в консоли, какие именно скрипты он запустил. |
| Автор: Bulat 25.3.2014, 12:01 | ||||
|
| Автор: Suppir 25.3.2014, 12:15 |
| Куда это прописать? Менять вывод всех 20 скриптов нет возможности. Нужно именно в пуске все прописать. |
| Автор: Bulat 25.3.2014, 12:31 | ||||
Suppir, считается, что
вот этот print и делает то, что тебе нужно. Но делает ли он это или нет у тебя - не знаю! Добавлено через 9 минут и 5 секунд Попробуй закомментировать строку
и посмотри что будет писаться в консоли. |
| Автор: Romikgy 25.3.2014, 12:47 | ||
|
| Автор: Suppir 25.3.2014, 12:54 | ||||||
| Romikgy, из нескольких потоков не может писать в один log.txt, т.к. "файл заблокирован другим процессом". Добавлено @ 12:56
Я закомментировал строку и получается следующее: 1) не пишется название запущенных скриптов; 2) выводится в консоль та информация, которую выдают запущенные скрипты. И мне нужно ровно наоборот - чтобы информация от скриптов (что, что в скриптах прописано через Print) не выводилась в консоль и чтобы отображались названия запущенных скриптов. |
| Автор: Suppir 25.3.2014, 13:07 | ||||||
Bulat, я закомментировал строки
Сейчас скрипт выглядит так:
Он работает неправильно: в консоль перенаправляется вывод со всех скриптов (вперемешку), а названия запущенных скриптов не отображаются. Добавлено через 1 минуту Понятно, что если закомментировать
, то ни один скрипт вообще не запустится. Добавлено через 2 минуты и 58 секунд Ну, получится 20-лог файлов с именами скриптов. Но дело в том, что и сейчас эти 20 скриптов создают 20-лог файлов с различной информацией. Зачем мне еще что-то писать. Нужно только запускать параллельно эти 20 скриптов и выводить в консоль, какие скрипты запущены - вот и все. |
| Автор: Bulat 25.3.2014, 13:13 | ||
Suppir, вообще-то я тебе писал совсем другое, но по закону Мерфи...
Так можно проверить вывод в консоль названия запускаемых скриптов, Если оное происходит - значит то, что ты хочешь уже делается! Нужно лишь маленько изменить сам запуск скриптов! |
| Автор: Suppir 25.3.2014, 13:23 | ||||
| Bulat, если оставить строчку
то в консоль выводятся названия скриптов. Это правильно. Проблема в другом. Если мы запустим скрипты строчкой
то эти скрипты начинают наперебой писать свою информацию в консоль пускача. То есть запускаемые потоки передают свой STDOUT в консоль пускача. Переделывать все скрипты нет возможности. Нужно отредактировать пускач таким образом, чтобы он отображал только названия запускаемых скриптов и не выводит их STDOUT в свою консоль. |
| Автор: Bulat 25.3.2014, 13:26 | ||
если ось юниксовая, то попробуй
P.S. я больше предпочитаю форки, но вроде как и с тредами должно работать! |
| Автор: Suppir 25.3.2014, 13:32 |
| Нет, виндовс стоит. Еще есть такой вариант. Чтобы скрипт пускач запускал скрипты Perl в отдельных окнах. И пусть они там себе в консоль выводят, что хотят. Такой вариант возможен? |
| Автор: Bulat 25.3.2014, 13:36 | ||
Если виндовс, то делай
самое оптимальное решение, которое не принесет за собой другие проблемы! |
| Автор: Suppir 25.3.2014, 13:42 | ||
| К сожалению, не оптимальное. Каждый скрипт выдает log-файл. А теперь он еще и создает лишние txt-файлы. Разве что стирать потом эти файлы в конце работы скрипта... Добавлено через 3 минуты и 45 секунд Короче, изменил код на следующий:
В файлы $item.temp пишется вывод STDOUT скриптов, а в конце скрипта пускач подчищает за собой эти темповые файлы. |
| Автор: Bulat 25.3.2014, 13:47 | ||
Ок. Если придумаешь надежное решение под виндовс по твоим требованиям - меня в соавторы! |
| Автор: Suppir 25.3.2014, 13:50 |
| Договорились |
| Автор: tzirechnoy 25.3.2014, 15:45 | ||||
Например,
|
| Автор: Romikgy 25.3.2014, 16:59 | ||
|
| Автор: alezzz 25.3.2014, 19:18 |
| А почему вывод перенаправляется с созданием нового файла? Может system($item." >> out.temp"), такой вариант не будет под windows блочить файл? А вообще действительно нехватает /dev/null Еще можно вместо system использовать `` (qx//). Тут вывод в консоль не должен попадать. |
| Автор: Romikgy 25.3.2014, 22:30 |
linux - /dev/null windows - null |
| Автор: alezzz 26.3.2014, 00:03 |
действительно есть, только nul, с одной "l" |
| Автор: Suppir 26.3.2014, 09:12 | ||
А может быть кто знает, как изящней вот это написать?
то есть получить имя скрипта без его пути. Например: c:/программы/test.pl - нужно получить "test.pl". |
| Автор: Bulat 26.3.2014, 09:20 | ||
| Suppir, сдается мне, что это строчка под юникс писалась! А если попробовать исправить вот так:
|
| Автор: Suppir 26.3.2014, 10:27 |
| Да нет, все под Windows написано и работает. Я думал, может есть какая волшебная переменная для получения названия скрипта без его пути. |
| Автор: Romikgy 26.3.2014, 10:31 | ||
|
| Автор: tzirechnoy 26.3.2014, 10:41 | ||
Никак. Написать это изящно -- невозможно. И не потому, что регэкспы сложные или модулей нет, а потому, что пытаться отфильтровать себя по имени -- это само посебе кривость и плохо сказывается на переносимости. Это в общем мне интуитивно-очевидно, но и так я за пять минут наткнулся на три нюанса: другие слэшы в linux, необходимость под linux запускать ./subscript.pl по причине отсутствие . в $PATH, привычка запускать perl runner.pl, которая тожэ привела к поломке. Правильнее -- создать поддиректорию, куда положыть либо сам запускающий скрипт, либо наоборот тех, кого нужно выполнить. |
| Автор: Bulat 26.3.2014, 10:43 | ||
у меня на linux $0 - дает как раз название скрипта без пути, как оно работает под виндовс - не знаю, под рукой нету! |
| Автор: arto 26.3.2014, 16:33 |
| ( split "[\\\\/]", $0 )[-1]; |
| Автор: Suppir 26.3.2014, 20:31 |
| у меня на linux $0 - дает как раз название скрипта без пути, как оно работает под виндовс - не знаю, под рукой нету! Windows дает полный путь по $0. Добавлено через 1 минуту и 28 секунд другие слэшы в linux, С этими сдешами беда. Я пишу одновременно на c#, perl и AutoIt. Везде приходится по-разному писать Добавлено через 1 минуту и 47 секунд arto, шутку юмора заценил Добавлено через 3 минуты и 32 секунды В общем, я попробовал позапускать скрипты в многопоточном режиме. На двухядерном процессоре E7300 преимущество в 1,5 - 2 раза по сравнению с последовательным запуском. Думаю, что на i5 или i7 преимущество будет в 3 - 4 и более раз. |