Самая большая проблема, с которой вы столкнетесь, - это большой объем памяти сервера приложений, когда вы выполняете форк для запуска скрипта, вы вполне можете исчерпать память и потерпеть неудачу. Когда вы разветвляетесь, система должна сделать полную копию исполняемого образа. Он не делает физическую копию, но он должен делать виртуальную. Итак, если у вас большая куча Java EE, например 4G реальной памяти (т.е. не только куча Java, общий размер процесса), то вам потребуется дополнительный «свободный» 4G реальной памяти и / или Swap, чтобы вилка имела достаточно виртуальное пространство произойдет.
Да, вы собираетесь немедленно выполнить команду sh или какую-либо другую команду, которая не будет поглощать миллиард ресурсов. Но система не может этого знать, и поэтому ей нужно действовать так, как будто ей придется запускать две копии вашего контейнера Java EE одновременно, даже на наносекунду.
Если у вас нет ресурсов для форка, форк завершается неудачей.
Если вам не хватает места, то вы можете создать маленького демона мини-запуска. Затем вместо того, чтобы ваше приложение Java EE разветвляло процесс, вы просто открываете сокет для своего демона, и ИТ разветвляет процесс. Очевидно, ожидается, что этот маленький демон потребляет гораздо меньше ресурсов, чем ваш контейнер, поэтому его стоит раскошелиться.
Демон может быть простым: взять командную строку для выполнения через сокет и просто выполнить то, что он получает (естественно, небезопасно, но ...), или простой rpc с кодом команды и некоторыми аргументами. Все, что подходит для вашего проекта. Вы можете написать это на Java, языке сценариев (Python, Perl, Ruby), что угодно. Множество способов сделать это.