|
|
|
Perl - Вызвать внешний скрипт с параметрами и получить результаты
|
|||
|---|---|---|---|
|
#18+
Есть скрипт-диспетчер, который обрабатывает передаваемые ему параметры и в зависимости от них запускает ту или иную процедуру. В запускаемую процедуру он передает какие-то параметры, когда процедура отработает (она должна возвращатькод возврата и желательно какую-то текстовую информацию), пишет в журнал результат выполнения этой процедуры. Подскажите, как это должно осуществляться? Сейчас у меня такой скелет для диспетчера (в $rsub имя скрипта-обработчика): Код: php 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. Не пойму, что должно быть в скрипте-обработчике. Если в нем выполняется exit, то завершается и скрипт-диспетчер (в консоль выводится только ***1). Если exit не указан, то после отработки обработчика управление возвращается к диспетчеру, но тогда непонятно, как получить код возврата. ________________________ Мы смотрим с оптимизмом... ...в оптический прицел. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.04.2012, 11:41:53 |
|
||
|
Perl - Вызвать внешний скрипт с параметрами и получить результаты
|
|||
|---|---|---|---|
|
#18+
С возвратом вроде бы определился. Если последней строкой в обработчике указать анонимный хэш (в котором будут указаны и код возврата, и текст), в диспетчере его можно получить в $ret. А как в обработчик передать аргументы? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.04.2012, 12:24:57 |
|
||
|
Perl - Вызвать внешний скрипт с параметрами и получить результаты
|
|||
|---|---|---|---|
|
#18+
Alibek B.А как в обработчик передать аргументы? Никак... Можешь использовать их внутри внешнего скрипта как глобальные переменные. Например: $::REG1 И вообще-то это не вызов внешнего скрипта. do EXPR Uses the value of EXPR as a filename and executes the contents of the file as a Perl script. do 'stat.pl'; is just like eval `cat stat.pl`; ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.04.2012, 12:38:47 |
|
||
|
Perl - Вызвать внешний скрипт с параметрами и получить результаты
|
|||
|---|---|---|---|
|
#18+
А как обычно подобная архитектура (диспетчер + обработчики во внешних файлах) реализуется? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.04.2012, 12:44:26 |
|
||
|
Perl - Вызвать внешний скрипт с параметрами и получить результаты
|
|||
|---|---|---|---|
|
#18+
Alibek B., Ну я бы например сделал через модули. Например: файл: m1.pm Код: php 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. нечто аналогичное в m2.pm файл: script.pl Код: php 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. Как-то так. (и exit в модулях вызывать не надо - завершится весь процесс) Ну а если обрабатывающие скрипты уже написаны и менять что-то лень или нет возможности. IPC::Run в помощь ( http://search.cpan.org/~toddr/IPC-Run-0.91/lib/IPC/Run.pm) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.04.2012, 13:28:30 |
|
||
|
Perl - Вызвать внешний скрипт с параметрами и получить результаты
|
|||
|---|---|---|---|
|
#18+
Модули не подходят, потому что список обработчиков может меняться. Сам диспетчер у меня выглядит так: Код: php 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. При такой схеме мне не нужно изменять диспетчер, чтобы добавить новый обработчик. Достаточно создать pl-файл с определенным именем и он будет обрабатываться автоматически. Ну и диспетчер не будет падать, если в каком-то из обработчиков будет синтаксическая ошибка. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.04.2012, 13:53:50 |
|
||
|
Perl - Вызвать внешний скрипт с параметрами и получить результаты
|
|||
|---|---|---|---|
|
#18+
Alibek B., Ну если с IPC::Run связываться не хочется, а хочется через do , то, как я выше написал, через глобальные переменные передавай параметры, должно получиться. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.04.2012, 14:07:03 |
|
||
|
Perl - Вызвать внешний скрипт с параметрами и получить результаты
|
|||
|---|---|---|---|
|
#18+
Да, через глобальные переменные работает. В диспетчере задаю $::ARG = { ... }, в обработчике выполняю my $ARG = $::ARG, затем в диспетчере обнуляю $::ARG = undef. Можно ожидать непредвиденные осложнения? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.04.2012, 14:13:30 |
|
||
|
Perl - Вызвать внешний скрипт с параметрами и получить результаты
|
|||
|---|---|---|---|
|
#18+
Alibek B.Да, через глобальные переменные работает. В диспетчере задаю $::ARG = { ... }, в обработчике выполняю my $ARG = $::ARG, затем в диспетчере обнуляю $::ARG = undef. Можно ожидать непредвиденные осложнения? Работает в один поток? Один процесс? Вроде ничего страшного не должно случиться, кроме того, что глобальные переменные зло :) Но если система не большая, то и так сойдет. Можно так подстраховаться: local $::ARG={}; ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.04.2012, 14:43:05 |
|
||
|
Perl - Вызвать внешний скрипт с параметрами и получить результаты
|
|||
|---|---|---|---|
|
#18+
Alibek B.Модули не подходят, потому что список обработчиков может меняться.Эта фраза ничтожна, так как лишена смысла. Посмотрите как делается перезагрузка модулей и загрузка модулей в ран тайме. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.04.2012, 19:31:51 |
|
||
|
Perl - Вызвать внешний скрипт с параметрами и получить результаты
|
|||
|---|---|---|---|
|
#18+
WarstoneПосмотрите как делается перезагрузка модулей и загрузка модулей в ран тайме. Очевидно для этого структура модуля должна соответствовать определенным правилам. Внешний же скрипт (хорошо, не внешний, эвалируемый) никакими обременениями в плане структуры не отягощен. Его вообще можно делать полностью автономным, вся разница будет в том, что в одном случае аргументы будут передаваться в @ARGV, в другом в $::ARG. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.04.2012, 22:19:17 |
|
||
|
Perl - Вызвать внешний скрипт с параметрами и получить результаты
|
|||
|---|---|---|---|
|
#18+
Alibek B.WarstoneПосмотрите как делается перезагрузка модулей и загрузка модулей в ран тайме. Его вообще можно делать полностью автономным, вся разница будет в том, что в одном случае аргументы будут передаваться в @ARGV, в другом в $::ARG.Да ни разу. В случае с модулем параметры будут в @_. В случае с внешним сриптом - параметры будут в @ARGV. А догодаться запускать еще одну копию перла через систем или еще чего - вы не догодались. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.04.2012, 23:18:15 |
|
||
|
Perl - Вызвать внешний скрипт с параметрами и получить результаты
|
|||
|---|---|---|---|
|
#18+
Nick121И вообще-то это не вызов внешнего скрипта. Напрасно я не обратил на это внимание. Скрипт эвалируется внутри глобального адресного пространства текущего скрипта. И соответственно, в нем нельзя подключать модули, объявлять процедуры которые бы конфликтовали с модулями/процедурами скрипта-диспетчера. С одной стороны есть некоторое удобство — в диспетчере можно написать общие процедуры и из обработчиков просто обращаться к ним. Но с другой, я полагал что у такого подхода преимуществом будет автономность скриптов-обработчиков (которые полноценно будут работать как при запуске из диспетчера, так и при самостоятельном запуске), а получается, этого преимущества нет и тогда уж лучше использовать pm-модули. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.04.2012, 13:40:40 |
|
||
|
Perl - Вызвать внешний скрипт с параметрами и получить результаты
|
|||
|---|---|---|---|
|
#18+
Alibek B.Но с другой, я полагал что у такого подхода преимуществом будет автономность скриптов-обработчиков (которые полноценно будут работать как при запуске из диспетчера, так и при самостоятельном запуске), а получается, этого преимущества нет и тогда уж лучше использовать pm-модули. Ну если это так критично или очень хочется :), еще раз: IPC::Run в помощь ( http://search.cpan.org/~toddr/IPC-Run-0.91/lib/IPC/Run.pm) На это тоже не обратили внимания? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.04.2012, 18:55:57 |
|
||
|
Perl - Вызвать внешний скрипт с параметрами и получить результаты
|
|||
|---|---|---|---|
|
#18+
Nick_K_121, my @res = `perl <scriptname.pl>` вот что надо ТСу. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.04.2012, 20:56:28 |
|
||
|
Perl - Вызвать внешний скрипт с параметрами и получить результаты
|
|||
|---|---|---|---|
|
#18+
Ни IPC::Run, ни вызов второго экземпляра perl я использовать не хочу. Во-первых, дело происходит в Windows, а там накладные расходы на запуск процессов и на IPC выше, чем в *nix. Запускаться же диспетчер может часто (это обработчик SMS-шлюза), причем он не в бесконечном цикле опрашивает шлюз, а шлюз при поступлении SMS запускает диспетчер, передавая ему необходимые данные. Во-вторых, это костыли, если уж делать правильно, то с подключаемыми модулями, используя plugin-архитектуру. Просто я с Perl знаком плохо и в нем не смогу это сделать правильно. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.04.2012, 22:06:38 |
|
||
|
Perl - Вызвать внешний скрипт с параметрами и получить результаты
|
|||
|---|---|---|---|
|
#18+
Alibek B., Ну для начала вам посмотреть как в DBI ищется драйвер DBD. Это поможет вам понять - как искать те или иные плагины (модули) в рантайме. Дальше... пусть тут меня поправят, но вроде-бы в модулях Apache2 есть код перезагрузки модуля (опять-таки в рантайме) если изменился его код. Ну и на последок... Берете любой менеджер процессов (я не видел таких в чистом виде, честно говоря) и смотрите как там сделана работа с процессами/потоками. Эти 3 вещи 99% что уже реализованы в том или ином модуле... Пусть тут подскажут - каком. но вообще, вдумчивый поиск по search.cpan.org даст вам почти все ответы. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.04.2012, 01:07:56 |
|
||
|
|

start [/forum/topic.php?fid=23&msg=37764023&tid=1465250]: |
0ms |
get settings: |
9ms |
get forum list: |
21ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
212ms |
get topic data: |
10ms |
get forum data: |
2ms |
get page messages: |
68ms |
get tp. blocked users: |
1ms |
| others: | 237ms |
| total: | 568ms |

| 0 / 0 |
