2012-03-20 3 views
3

В настоящее время я работаю в проекте WebLogic Java EE, где время от времени приложение выполняет скрипт Perl для выполнения некоторых пакетных заданий. В приложении сценарий становится вызывается какЛучший способ запуска скрипта Perl из weblogic Приложение Java EE

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

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

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

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

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

Вы используете 64-битную JVM? –

ответ

0

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

Предполагая, что вам нужно 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 

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

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

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

1

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

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

  • Используйте 64Bit OS и виртуальной машины Java, толкает проблему вниз по дороге до сих пор это не имеет значения
  • Отправьте свой сценарий в другом процессе (например, HTTPD) и соберите его с помощью HTTP-запроса для его вызова
+0

Ваше первое решение не будет работать так, как есть. В любом случае, нет 32-разрядной Solaris 10 для SPARC и будет ли JVM 32 или 64 бит не иметь никакого значения. – jlliagre

+0

Нужно сказать, что мой опыт был связан с Linux, и это имело большое значение, 64-битное ядро ​​всегда должно быть в состоянии развиваться по мере необходимости, достаточно виртуального адресного пространства. –

+0

Linux перегружает память, поэтому переключение на 64-битное ядро ​​позволило бы почти неограниченное резервирование памяти в этой ОС. Это не относится к Solaris. 64-битное ядро ​​- это то, что работает Anindya, и проблема там. В Solaris 64-разрядная JVM фактически ухудшит проблему, поскольку ее размер будет больше. – jlliagre

1

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

Смежные вопросы