设置Windows服务的工作目录

时间:2017-06-27 16:20:52

标签: windows-services apache-commons-daemon

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

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

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

2 个答案:

答案 0 :(得分:0)

--StartPathjvm结合使用,而不是将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,这已经是很长时间了:

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

答案 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%