运行 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。
我正在开发 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。