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



我正在研究WinDRBD(https://github.com/LINBIT/windrbd(Linux DRBD驱动程序的端口,用于Microsoft Windows。

我们希望将用户模式帮助程序作为 Windows 服务运行(DRBD 有时使用 call_usermodehelper(( 调用用户空间应用程序,我们通过守护程序模拟它,该守护进程从内核驱动程序检索这些请求,运行它们并将退出状态返回到内核(。

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

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

/bin/sh 未被服务找到,但是/cygdrive/c/cygwin64/bin/sh 存在,所以当我使用该路径运行 shell 时,它可以启动 (并且还查找运行所需的 DLL(。然而壳 投诉:

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 用于用户模式(。

感谢您的任何见解,

  • Johannes

正如matzeri指出的那样,cygrunsrv是cygwin工具,当涉及到在Windows下运行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 Service API 代码( 调用那里,它只是一个 Cygwin/POSIX 可执行文件(,日志服务器是参数 到二进制文件(所以正在启动的是 windrbd 日志服务器(和 -1 和 -2 是 stdout 和 stderr 的引用。正是我需要的,感谢马泽里 为我指出Cygrunsrv。

最新更新