使用javaw在批处理文件中运行JAR会导致process explorer-XYNTService中出现多个java进程

使用javaw在批处理文件中运行JAR会导致process explorer-XYNTService中出现多个java进程,java,service,windows-services,batch-file,jvm,Java,Service,Windows Services,Batch File,Jvm,我有一个有点奇怪的问题。我有一个java应用程序,它安装了一些作为JAR运行的服务。以前我使用安装的Java来运行这些JAR。共有四个服务,所有服务都将从一个批处理文件中实例化,并相互顺序调用。像这样的, start %JAVA_HOME% commandtoruntjarfile 所有四个服务都将在后台运行,并且只有一个java.exe在process explorer中可见。因此,我安装了另一个windows服务,它将通过调用run bat或shutdown bat来启动或停止这些服务 现

我有一个有点奇怪的问题。我有一个java应用程序,它安装了一些作为JAR运行的服务。以前我使用安装的Java来运行这些JAR。共有四个服务,所有服务都将从一个批处理文件中实例化,并相互顺序调用。像这样的,

start %JAVA_HOME% commandtoruntjarfile
所有四个服务都将在后台运行,并且只有一个java.exe在process explorer中可见。因此,我安装了另一个windows服务,它将通过调用run bat或shutdown bat来启动或停止这些服务

现在,客户的需求变为使用java的内部化版本。我将java提取到一个位置,使我们自己的环境变量名为“ABC_HOME”,并将批处理中所需的语法更改为

%ABC_HOME%\javaw commandtorunjarfile
当它运行时,它工作。但这是无法阻止的。当我转到process explorer时,我看到批处理文件中的四个运行命令分别运行4个java.exe。如果我停止windows服务,所有四个都会继续工作。如果我重新启动windows服务,process explorer中的java.exe数量将变为8个,并持续增加,直到windows拥有足够的java.exe

我怎样才能避开它?我认为解决方案应该是在process explorer中使用一个java进程,但我似乎找不到任何解决方案

[编辑] 这四个子服务实际上是XYNT进程。在正常情况下,会是这样的 [过程1] CommandLine=java-Xrs-DasService=yes-cp文件 WorkingDir=c:bin scache PauseStart=1000 PauseEnd=1000 用户界面=否 重启=是

要从特定位置使用java,需要进行以下更改

CommandLine = %JAVA_PATH%\bin\java.exe -Xrs -DasService=yes -cp jarfiles
但这不起作用,因为它不接受XYNT.ini文件中的path变量。所以我在这里调用了一个批处理文件,在这个批处理文件中我使用了上面的代码。这就是变化的样子

CommandLine = batchfile.bat
在batchfile.bat中

%JAVA_PATH%\bin\java.exe -Xrs -DasService=yes -cp jarfiles

通常,系统上运行的每个Java程序都有自己的虚拟机运行,这意味着:每个程序实例都有一个Java.exe/javaw.exe

我无法从您的角度解释为什么它能像您首先描述的那样使用java.exe“工作”,但您描述的javaw.exe行为(在process explorer中有4个java进程)将是我所期望的


对我来说,问题不在于为什么会看到4对1的java进程,而在于如何启动/停止“服务”。从外部杀死JavaVM似乎不是一个很好的解决方案。我会考虑在java服务中建立一些IPC,允许您优雅地终止进程。我们不能从外部杀死JVM,因为这将是愚蠢的,如果这是我们所做的,我们也会为这个问题这么做。在前面的例子中,由于windows服务和四个隐藏服务都在同一个进程中,所以优雅的终止是有效的。因此,在windows服务停止之前,jvm不会关闭。但是当jvm关闭时,在同一jvm下运行的其他四个服务也将关闭。因为现在这些是在不同进程ID下运行的不同JVM,关闭一个不会对其他JVM产生任何影响。在Windows上,有“Windows NT服务”的概念,您可以使用服务管理单元启动/停止该服务。在Linux上有守护进程。它们有一个共同点,那就是它们都没有用户界面,也不是交互式的。你的“服务”是什么?您知道,有一些包装器允许您将java应用程序作为Windows NT服务运行—这是解决问题的有效方法吗?因此,有四个服务在后台运行,并从xynt服务实例化。此xynt服务由windows服务控制,该服务与可安装的另一个windows服务类似,并且在windows服务中可见。快速阅读说明xynt服务可以运行多个服务,并且具有启动/停止服务的命令行选项。这意味着您的“真正的”windows服务将能够通过使用正确的命令行选项调用XYNTService来控制启动哪些服务。是。所以我需要在XYNTService中启动四个服务。它们一开始很好,但在4个不同的JVM中,因此除非我执行全java进程终止之类的操作,否则XYNTService无法停止它们。当链接到此XYNT的Windows服务重新启动时,所有四个服务都会重新启动,最终只有8个JVM,而不是4个JVM,而且这个数字还在不断增加。我将尝试Windows shell路径概念,看看这是否有帮助。因此,当我运行XYNT时,它的shell中将有自定义java路径,希望这样我就不需要给出完整的java路径位置。