我正在使用Apache Commons Daemon的procrun将Java应用程序包装为Windows服务。我遇到的问题与服务的工作目录有关,C:\Windows\system32
。服务所需的配置文件是相对于应用程序引用的(在.\conf
目录中)。
我尝试了--StartPath
procrun
参数,但它并没有影响服务的工作目录。 (更新:我现在看到该参数仅在启动exe时有效。)我试图保持应用程序跨平台,所以除非绝对必要,否则我不想修改配置文件路径。
有没有办法设置Windows服务的工作目录?
答案 0 :(得分:0)
将--StartPath
与jvm
结合使用,而不是将exe
作为--StartMode
,并使用几小时前下载的Apache Commons Daemon 1.1。
在没有--StartPath
的情况下,即使prunsrv
是在外壳程序上使用pushd
和正确的目录启动的,我的守护进程也找不到它的配置文件。 Process Monitor显示存储prunsrv
的目录被用作当前的工作目录。有了--StartPath
,并且只有以前的内容,守护进程现在发现它是自己的配置文件,并且Logback也正在正确初始化,仅在logback.xml
中使用相对路径才有意义正确的当前工作目录。
所以您过去所做的任何事情都可能是错误的,或者此后可能已添加了该功能。查看源代码,我不会感到--StartPath
也仅依赖或影响Exes:
if (_jni_startup) {
if (IS_EMPTY_STRING(SO_STARTPATH))
SO_STARTPATH = gStartPath;
if (IS_VALID_STRING(SO_STARTPATH)) {
/* If the Working path is specified change the current directory */
SetCurrentDirectoryW(SO_STARTPATH);
}
https://github.com/apache/commons-daemon/blob/trunk/src/native/windows/apps/prunsrv/prunsrv.c#L1201
我们希望这不是不确定的行为,因为行为上的文档内容不同:
起始映像可执行文件的工作路径。
OTOH,这已经是很长时间了:
答案 1 :(得分:0)
这可能不是同一问题。但是,我发现procrun对--StartPath
参数给出的路径周围的双引号的解释存在问题。我的安装批处理文件如下:
SET ROOTDIR=%~dp0
"%ROOTDIR%prunsrv.exe" install MyServiceName ... --StartPath="%ROOTDIR%" ...
不带引号的路径在%ROOTDIR%
中的第一个空格处结束。为了处理空格,我在路径两边加上了双引号。然后,当我查看注册表时,我可以看到Computer\HKEY_LOCAL_MACHINE\SOFTWARE\WOW6432Node\Apache Software Foundation\Procrun 2.0\MyServiceName\Parameters\Start\WorkingPath
的值已除去起始引号,但没有终止号,并且该值包括所有以下参数。因此,其他注册表项将丢失。
可怕的解决方法是:
--StartPath
作为最后一个参数,因此批处理文件现在看起来像:
SET ROOTDIR=%~dp0
"%ROOTDIR%prunsrv.exe" install MyServiceName ... ... --StartPath="%ROOTDIR%