Запуск приложения CygWin в качестве службы Windows - PullRequest
0 голосов
/ 08 октября 2018

Я работаю над WinDRBD (https://github.com/LINBIT/windrbd) порт драйвера Linux DRBD для Microsoft Windows.

Мы хотим запустить помощник пользовательского режима в качестве службы Windows (DRBD иногда вызывает пространство пользователяприложения с call_usermodehelper (), который мы эмулируем с помощью демона, который получает эти запросы от драйвера ядра, запускает их и возвращает состояние выхода в ядро).

Когда мы запускаем демон в оболочке cygwin, всеработает нормально. Однако при запуске демона в качестве службы 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

(гм для режима пользователя).

Спасибо за любые идеи,

  • Йоханнес

1 Ответ

0 голосов
/ 09 октября 2018

Как указал matzeri, cygrunsrv - это инструмент cygwin, когда речь идет о запуске бинарных файлов cygwin как службы под Windows.Он служит как обертка (которая выполняет API-интерфейс службы Windows и обработка событий), а также как инструмент для установки, удаления, запуска и остановки служб (это все еще можно сделать с помощью утилиты 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-сервер является аргументом для двоичного файла (поэтому то, что запускается, является windrbd log-server), а -1 и -2 -переориентирует на stdout и stderr.Именно то, что мне нужно, спасибо Matzeri за указание на cygrunsrv.

...