2

我正在使用 Apache Commons Daemon 的procrun将 Java 应用程序包装为 Windows 服务。我遇到的问题与服务的工作目录有关,即C:\Windows\system32. 服务所需的配置文件是相对于应用程序(在.\conf目录中)引用的。

我尝试了--StartPath参数,procrun但它并没有影响服务的工作目录。(更新:我现在看到该参数仅在启动 exe 时才有效。)我试图保持应用程序跨平台,因此除非绝对必要,否则我不想修改配置文件路径。

有没有办法设置 Windows 服务的工作目录?

4

2 回答 2

0

--StartPath作品与我结合使用jvm而不是exeas--StartMode并使用几小时前下载的 Apache Commons Daemon 1.1。

如果没有,即使使用正确的目录在 shell 上启动--StartPath,我的守护程序也找不到它的配置文件。进程监视器显示存储的目录被用作当前工作目录。有了,并且只有我之前拥有的那个,我的守护进程现在发现它自己的配置文件并且 Logback 也在正确初始化,使用相对路径只有在正确的当前工作目录的情况下才有意义。prunsrvpushdprunsrv--StartPathlogback.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,很长一段时间以来都是这样:

https://github.com/apache/commons-daemon/commit/4664a01b6dfc8f5e34596f6b327d4498783c2a18#diff-880a104d7fb49226503af45f7d72593eR850

于 2018-09-26T18:05:21.213 回答
0

这可能不是同一个问题。但是,我发现 procrun 对--StartPath参数路径周围双引号的解释存在问题。我的安装批处理文件如下所示:

SET ROOTDIR=%~dp0
"%ROOTDIR%prunsrv.exe" install MyServiceName ... --StartPath="%ROOTDIR%" ...

不带引号的路径在%ROOTDIR%. 为了处理空格,我在路径周围加上了双引号。然后,当我查看注册表时,我可以看到 for 的值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%
于 2019-01-09T21:20:12.560 回答