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
Java apachecommons执行进程的优雅终止_Java_Unix_Apache Commons_Apache Commons Exec - Fatal编程技术网

Java apachecommons执行进程的优雅终止

Java apachecommons执行进程的优雅终止,java,unix,apache-commons,apache-commons-exec,Java,Unix,Apache Commons,Apache Commons Exec,我正在启动Java程序(Linux上)中的一个外部进程,我需要能够向它发送一个SIGTERM信号,而不是exec.getWatchdog().destroyProcess()正在发送的SIGKILL。有没有一种方法可以更优雅地停止由commons exec启动的unix进程?或者我可以获取PID,这样我就可以自己运行相应的kill命令了吗?好的,您可以将其grep,例如: for i in $(ps -ef | grep -i "[Y]ourClassName" | awk '{print $2

我正在启动Java程序(Linux上)中的一个外部进程,我需要能够向它发送一个SIGTERM信号,而不是
exec.getWatchdog().destroyProcess()
正在发送的SIGKILL。有没有一种方法可以更优雅地停止由commons exec启动的unix进程?或者我可以获取PID,这样我就可以自己运行相应的kill命令了吗?

好的,您可以将其grep,例如:

for i in $(ps -ef | grep -i "[Y]ourClassName" | awk '{print $2}'); do kill -9 $i; done

在这种情况下,如果您让它运行超过1次(虽然如果您只有一个项目,它可以工作),请注意grep中的[],即grep不会给您自己的进程pid,-i代表忽略情况,awk只用于打印第二列,即pid编号。

好的,Commons Exec依赖于Java进程类,这不会暴露PID。它也是用来杀死进程的东西,所以你不能改变进程的行为。一切都很好。一定要爱你,嗯

如果您只是在后台启动进程,那么可以将它们封装在一个简单的shell脚本中,为您捕获PID,然后将其保存到Java例程知道的“已知位置”。仍然有点混乱,而且,很自然,它不能很好地移植到其他平台

您也可以使用JNI编写自己的exec函数来捕获这些信息,但这可能不太友好

您可以用更面向系统的语言(C、Python等)编写特定于平台的exec launcher守护程序。您向IT发送启动和停止信息,IT会为您处理该过程。这样做的一个好处是,在运行新进程时,不必分叉JVM(根据JVM的大小,这可能会非常昂贵)


您可以从一开始就启动守护进程,并共享一个套接字或一个管道(两者都非常可移植)。这实际上不是一个非常不雅观的解决方案,它划分了许多特定于系统的行为(因此您可以在Windows和Unix上使用完全不同的进程,比如说,您的Java保持不变,您只需要移植您的小守护进程),而无需运行JNI。

ExecuteWatchLog类具有终止进程的方法

所以,您可以创建一个长超时的看门狗,并在必要时使用它来终止进程,即

executor.getWatchdog().destroyProcess();

这是一种可能性,但是我运行了同一个脚本的多个调用,我真的宁愿停止外部进程启动的那一个,而不是尝试使用命令行再次将它们链接在一起。我认为没有办法从commons exec获得PID?@jtb Will Hartung有更好的主意,如果你问我的话,只要用shell脚本包装你的jar,你仍然可以使用这个grep或另一个来完全杀死你想要的。是的,这是一个从shell脚本执行java jar的好主意,这样你就知道要杀死哪一个了+1好的,谢谢你提供的信息。真奇怪,他们没有公开这种功能,我只能用python来解决它。真糟糕,没错,但那会让西格基尔发疯。问题是如何发送一个不同的信号,比如SIGTERM来更优雅地停止它。@audras实际上,您最好使用
新的executewatchlog(executewatchlog.INFINITE\u TIMEOUT)
,而不仅仅是长超时。