基本上我想使用jsp网页,所以在Java中,在linux服务器上运行(管理)不同的后台进程(可能是运行的任何东西)。
他们需要以与网络本身不同的用户身份运行。
我想知道我有哪些选择?
我刚发现
Runtime rt = Runtime.getRuntime();
Process proc = rt.exec("linux command");
可能会奏效。
但我不知道刚启动的(child?)进程是否会完全脱离java servlet进程?是否有可能在不同的帐户下运行它?
答案 0 :(得分:0)
在所谓的终身运行的Java EE Web应用程序中使用Runtime
是一个坏主意。
首先,Runtime
创建的新进程将按设计分配与当前运行的Java环境一样多的新堆内存。这可能不一定会损坏一个简单的Java应用程序,它默认使用64MB或者其他东西,但是在通常以千兆字节为单位分配内存的Java EE Web应用程序中,这将是一个完全的内存浪费。
其次,您只是不希望在Java EE Web应用程序中生成非托管进程/线程。如果进程/线程停止和/或永远运行会导致无法在必要时关闭/重启Java EE Web应用程序(首先需要完全删除它),该怎么办?如果进程崩溃并沿着它删除整个Java EE运行时该怎么办?
最后,您无法更改运行该流程的用户。它将始终是执行当前运行的Java运行时的同一用户。
你基本上有两个选择:
根本不要使用Java。例如,只需使用平台提供的后台作业管理器来完成工作,例如基于Unix的平台中的Cron和基于Windows的平台中的任务计划程序。
在100%Java中完成。使用纯Java执行相同的目标,而无需生成进程。如有必要,您可以使用ExecutorService
API或Quartz等第三方库来管理后台作业。请注意,即使这些作业仍然需要运行100%纯Java代码。