Лучший способ запустить скрипт на Perl из приложения weblogic Java EE - PullRequest
3 голосов
/ 20 марта 2012

В настоящее время я работаю в проекте Weblogic Java EE, где время от времени приложение выполняет сценарий Perl для выполнения некоторых пакетных заданий.В приложении сценарий вызывается как

Process p = Runtime.getRuntime().exec(cmdString);

Хотя это опасный способ запуска, но он работал должным образом, пока у нас не было требования выполнить сценарий синхронно в цикле for.После нескольких запусков мы получаем java.io.IOException: Not enough space, так как, вероятно, ОС исчерпывает виртуальную память при выполнении в цикле for.В результате мы вообще не можем запускать сценарий на сервере.

Я отчаянно ищу более безопасный и лучший способ запустить сценарий Perl, где нам не нужно разветвлять родительский процесс.или, по крайней мере, не использовать все пространство подкачки!

Спецификация выглядит следующим образом:

Appserver - Weblogic 9.52  
JDK - 1.5   
OS - SunOS 5.10 
Sun-Fire-T200

Ответы [ 3 ]

1 голос
/ 20 марта 2012

Создайте perl-сервер, который считывает perl-скрипты по сети и выполняет их один за другим.

1 голос
/ 20 марта 2012

У меня было что-то похожее пару раз. Поскольку дочерний процесс является ветвью (очень большого родителя, он может видеть, что он разделяет всю свою память (используя копирование при записи). Я обнаружил, что ядро ​​должно быть в состоянии гарантировать, что оно может скопировать все Страницы памяти перед тем, как разбудить ребенка, на 32-битной ОС у вас кончается виртуальная голова, бегите очень быстро.

Возможные решения:

  • Использование 64-битной ОС и JVM позволяет решить проблему в будущем, пока это не имеет значения
  • Разместите ваш скрипт в другом процессе (например, HTTPD) и проткните его, используя HTTP-запрос, чтобы вызвать его
0 голосов
/ 24 марта 2012

Если вы хотите сохранить свой код без изменений и иметь достаточно свободного места на диске, вы можете просто добавить достаточно большую область подкачки в вашу ОС.

Если вам нужно 10 ГБ, вот как вы это делаете с UFS:

mkfile 10g /export/home/10g-swap
swap -a /export/home/10g-swap
echo "/export/home/10g-swap - - swap - no -" >> /etc/vfstab

Если вы используете ZFS, это будет:

zfs create -V 10gb rpool/swap1
swap -a /dev/zvol/dsk/rpool/swap1

Не беспокойтесь об этом большом свопе, это не повлияет на производительность, так как своп будет использоваться только для резервирования виртуальной памяти, а не для нумерации страниц.

В противном случае, как уже предлагалось в предыдущих ответах, один из способов избежать проблемы виртуальной памяти, с которой вы сталкиваетесь, - это использовать вспомогательную программу, то есть небольшую службу, с которой вы контактируете через сетевой сокет (или протокол более высокого уровня, такой как ssh) и он выполняет сценарий perl «удаленно».

Обратите внимание, что проблема не имеет ничего общего с 32-разрядной или 64-разрядной JVM, просто Solaris не перегружает память, и это сделано специально.

...