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

时间:2018-10-08 14:52:07

标签: windows service cygwin registry posix

我正在使用WinDRBD(https://github.com/LINBIT/windrbd)到Microsoft Windows的Linux DRBD驱动程序的端口。

我们想将用户模式帮助程序作为Windows服务运行(DRBD有时使用call_usermodehelper()调用用户空间应用程序,由守护程序进行仿真,该守护程序从内核驱动程序中检索那些请求,运行它们并将退出状态返回给内核)。

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

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

服务未找到

/ bin / sh,但是/ cygdrive / c / cygwin64 / bin / sh 存在,所以当我使用该路径运行外壳程序时,它可以启动 (并找到运行它所需的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用于用户模式)。

感谢您的见解,

  • 约翰内斯

1 个答案:

答案 0 :(得分:1)

正如matzeri指出的那样,在Windows下将cygwin二进制文件作为服务运行时,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 Service API的代码 调用那里,它只是一个Cygwin / POSIX可执行文件),log-server是参数 到二进制文件(因此正在启动的是windrbd日志服务器)以及-1和-2 是stdout和stderr的重定向。正是我需要的,感谢matzeri 将我指向cygrunsrv。