Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/unix/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在JavaEE环境中运行unix脚本?_Unix_Jakarta Ee - Fatal编程技术网

在JavaEE环境中运行unix脚本?

在JavaEE环境中运行unix脚本?,unix,jakarta-ee,Unix,Jakarta Ee,任何人都可以分享他们从JavaEE环境(servlet或EJB)调用unix脚本的经验吗?请注意,这些脚本将被调用以进行实时处理,而不是脱机处理。您将遇到的最大问题是,如果您的应用程序服务器内存映像太大,那么当您分叉运行脚本时,很可能会耗尽内存,导致分叉失败。分叉时,系统需要制作可执行映像的完整副本。它不制作物理拷贝,但需要制作虚拟拷贝。因此,如果您有一个大的JavaEE堆,比如4G的真实内存(即,不仅仅是Java堆,总进程大小),那么您需要额外的“空闲”4G真实RAM和/或交换,以使fork具

任何人都可以分享他们从JavaEE环境(servlet或EJB)调用unix脚本的经验吗?请注意,这些脚本将被调用以进行实时处理,而不是脱机处理。

您将遇到的最大问题是,如果您的应用程序服务器内存映像太大,那么当您分叉运行脚本时,很可能会耗尽内存,导致分叉失败。分叉时,系统需要制作可执行映像的完整副本。它不制作物理拷贝,但需要制作虚拟拷贝。因此,如果您有一个大的JavaEE堆,比如4G的真实内存(即,不仅仅是Java堆,总进程大小),那么您需要额外的“空闲”4G真实RAM和/或交换,以使fork具有足够的虚拟空间

是的,您将立即执行sh或其他一些不会占用大量资源的命令。但是系统无法知道这一点,因此它需要表现得好像必须同时运行两个javaee容器副本,即使是一纳秒

如果您没有fork的资源,fork将失败

如果您的空间有限,那么您可以做的就是创建一个小型exec启动程序守护程序。然后,您只需打开守护进程的套接字,而不是JavaEE应用程序来分叉进程。显然,我们的期望是这个小守护进程消耗的资源比您的容器少得多,因此分叉成本很低


守护进程可以很简单,通过套接字执行命令行,然后只执行它得到的(可能不安全,自然,但是…),或者使用命令代码和一些参数执行简单的rpc。任何适合你的项目。您可以用Java编写它,一种脚本语言(Python、Perl、Ruby),无论什么。有很多方法可以做到这一点。

从JavaEE容器派生进程可能不是正确的方法。 如果这些是shell脚本,它们将不可移植。 如果要使用事务支持,可以使用将脚本重写为作业。 这更可能是JavaEE做类似事情的方式

编辑:在注释中添加您的需求后,这应该可以工作

Process process = new ProcessBuilder(command).start();
更多细节


请注意,如果使用脚本和/或管道(没有本机可执行文件),则必须包含shell来调用命令(和设置管道)

一种可能是编写一个侦听JMS队列并调用脚本的小型应用程序。这样,脚本执行与应用程序服务器分离,因此不会遇到任何规范限制。

目前,我们的应用程序是一个Eclipse插件,它使用大量Unix脚本来实现一些功能。我们的目标是使它成为一个基于web的应用程序,我们希望重用相同的Unix脚本。我的想法是从AppServer调用这些unix脚本。你能建议一个更好的方法吗?