我正在尝试使用apache公共守护进程创建windows服务,但我无法让它按预期的方式工作。
使用jvm模式,它总是返回错误1067,没有进一步的解释。以下是运行日志:
[2020-11-18 15:56:20] [info] [11104] Apache Commons Daemon procrun (1.2.3.0 32-bit) started.
[2020-11-18 15:56:20] [info] [11104] Running Service 'ServiceTest14'...
[2020-11-18 15:56:20] [info] [14684] Starting service...
因为我需要rxtx,而且我没有找到一个可以工作的64位实现(这是另一个故事),所以我不得不使用32位jre:
C:\ServiceTest>java -version
java version "1.8.0_271"
Java(TM) SE Runtime Environment (build 1.8.0_271-b09)
Java HotSpot(TM) Client VM (build 25.271-b09, mixed mode, sharing)
所以我尝试了两个procrun版本:64位和32位。没有区别。在这两种情况下,windows事件记录器都会报告一个没有任何有用信息的崩溃,至少对我来说不是这样。
[2020-11-18 16:52:53] [info] [20248] Apache Commons Daemon procrun (1.2.3.0 64-bit) started.
[2020-11-18 16:52:53] [info] [20248] Running Service 'ServiceTest14'...
[2020-11-18 16:52:53] [info] [20000] Starting service...
下面是prorun config/setup脚本:
set SERVICE_NAME=ServiceTest14
set SERVICE_PATH=C:\ServiceTest
set JAR=ServiceTest2.jar
set SERVICE_CLASS=it.stikez.servicetest2.ServiceTest2
set PR_INSTALL=%SERVICE_PATH%\prunsrv.exe
sc stop %SERVICE_NAME%
sc delete %SERVICE_NAME%
REM Service log configuration
set PR_LOGPREFIX=%SERVICE_NAME%
set PR_STDOUTPUT=%SERVICE_PATH%\logs\stdout.txt
set PR_STDERROR=%SERVICE_PATH%\logs\stderr.txt
REM Path to java installation
set PR_CLASSPATH=.;%SERVICE_PATH%\%JAR%;%SERVICE_PATH%\lib\*
REM JVM configuration
set PR_JVMMS=256
set PR_JVMMX=1024
REM Install service
%SERVICE_PATH%\prunsrv.exe //IS//%SERVICE_NAME% ^
--Description="Test Service 7" ^
--Install=%PR_INSTALL% ^
--Startup=auto ^
--Jvm="C:\Program Files (x86)\Java\jre1.8.0_271\bin\client\jvm.dll" ^
--StartPath=%SERVICE_PATH% ^
--StartMode=jvm ^
--StartClass=%SERVICE_CLASS% ^
--StartMethod=main ^
--StartParams=start ^
--StopPath=%SERVICE_PATH% ^
--StopMode=jvm ^
--StopClass=%SERVICE_CLASS% ^
--StopMethod=main ^
--StopParams=stop ^
--LogPath=%SERVICE_PATH%\logs ^
--LogLevel=Trace
将jvm值设置为auto或一些无意义的胡言乱语(比如随机字符)也没什么区别。但至少如果使用java模式(而不是jvm),它会启动。至少。停止动作不起作用;我认为它是在新的jvm会话中产生的,因为控制变量不受stop调用的影响。
下面是所使用的java代码示例(直接从apache站点获取,并做了一些修改,因为我不需要linux可移植性。
package it.stikez.servicetest2;
public class ServiceTest2 {
private static ServiceTest2 engineLauncherInstance = new ServiceTest2();
private static boolean stop = false;
public static void main(String[] args) {
String cmd = "start";
if (args.length > 0) {
cmd = args[0];
System.out.println("Service called with param: " + cmd);
}
if ("start".equals(cmd)) {
engineLauncherInstance.windowsStart();
} else {
engineLauncherInstance.windowsStop();
}
}
public void windowsStart() {
System.out.println("windowsStart called");
initialize();
while (!stop) {
System.out.println("nloop stop=" + stop);
// don't return until stopped
synchronized (this) {
try {
this.wait(60000); // wait 1 minute and check if stopped
} catch (InterruptedException ie) {
System.out.println("interrupted; stop=" + stop);
}
}
}
System.out.println("Service end");
}
public void windowsStop() {
System.out.println("windowsStop called (stop=" + stop + ")");
terminate();
synchronized (this) {
System.out.println("stop sync area");
// stop the start loop
this.notify();
}
System.out.println("stop call elaborated (stop=" + stop + ")");
}
private void initialize() {
}
public void terminate() {
stop = true;
}
}
我正在(拼命地)寻找一种方法,让它在jvm模式下工作,或者在用户需要的时候使用任何其他魔术来正确地停止服务。
暂无答案!
目前还没有任何答案,快来回答吧!