运行 Cygwin 应用程序作为 Windows 服务

Running Cygwin application as a Windows Service

我正在开发 WinDRBD (https://github.com/LINBIT/windrbd) Linux DRBD 驱动程序到 Microsoft Windows.

的端口

我们希望 运行 用户模式助手作为 Windows 服务(DRBD 有时使用 call_usermodehelper() 调用用户 space 应用程序,我们通过从内核驱动程序检索这些请求的守护进程,运行s 它们和 returns 内核的退出状态)。

当我们 运行 cygwin shell 中的守护进程时,一切正常。但是,当 运行 将守护程序作为 Windows 服务时,cygwin 似乎找不到它的安装目录(在我的机器上是 C:\cygwin64)。

注册表项 (HKLM/Software/CygWin/setup/rootdir) 指向正确的位置,但我不确定 Windows 服务是否也可以访问它?

服务未找到

/bin/sh,但是 /cygdrive/c/cygwin64/bin/sh 存在,所以当我 运行 具有该路径的 shell 时,它可以开始 (还可以找到 运行 所需的 DLL)。然而 shell 抱怨:

bash.exe:警告:找不到/tmp,请创建!

当 运行以正常方式使用 cygwin 时肯定存在。

有没有人试过 运行 CygWin 编译的 EXE 作为 Windows 服务?这是 sc 查询 windrbdum 的输出:

SERVICE_NAME: windrbdum 
    TYPE               : 10  WIN32_OWN_PROCESS  
    STATE              : 4  RUNNING 
                            (STOPPABLE, NOT_PAUSABLE, IGNORES_SHUTDOWN)
    WIN32_EXIT_CODE    : 0  (0x0)
    SERVICE_EXIT_CODE  : 0  (0x0)
    CHECKPOINT         : 0x0
    WAIT_HINT          : 0x0

(um是用户模式).

感谢您的任何见解,

正如 matzeri 所指出的,当谈到 运行 cygwin 二进制文件作为 Windows 下的服务时,cygrunsrv 是 cygwin 工具。它既可以作为包装器(执行 Windows 特定服务 API 和事件处理),也可以作为安装、删除、启动和停止服务的工具(这仍然可以通过 sc 实用程序完成喜欢

sc start <servicename>

).

要安装服务 (I),请执行以下操作:

cygrunsrv.exe -I windrbdlog -p /cygdrive/c/windrbd/usr/sbin/windrbd.exe \
  -a log-server \ 
  -1 /cygdrive/c/windrbd/windrbd-kernel.log \ 
  -2 /cygdrive/c/windrbd/windrbd-kernel.log

其中 windrbdlog 是服务的 Windows 名称,/cygdrive ... 是 cygwin 应用程序的完整路径(无需编码任何 Windows 服务 API 在那里调用,它只是一个 Cygwin/POSIX 可执行文件),log-server 是参数 到二进制文件(所以正在启动的是 windrbd 日志服务器)和 -1 和 -2 是 stdout 和 stderr 的重定向。正是我需要的,感谢 matzeri 为我指点 cygrunsrv。