В Windows 7, как отправить Ctrl-C или Ctrl-Break в отдельный процесс

В нашей группе давно работают процессы, которые выполняются ежедневно. Процессы обычно начинаются в 9 часов вечера в любой день и продолжаются до 7 часов вечера следующего дня. Таким образом, они обычно работают 22 часа в сутки. Они запускаются запланированными задачами на серверах с определенным общим идентификатором пользователя, и они запускаются и работают независимо от того, вошел ли этот идентификатор пользователя в систему. Таким образом, они представляют собой консольные исполняемые файлы без окон.

Задачи координируют вычисления, выполняемые на большой ферме серверов. Обычно эти управляющие задачи выполняются непрерывно в течение полных 22 часов в день. Однако нам часто приходится останавливать и перезапускать эти процессы. Поскольку они контролируют множество задач, выполняемых в нашей ферме серверов, важно, чтобы они были аккуратно закрыты, чтобы они могли останавливать и завершать все процессы фермы серверов. Что подводит меня к нашей проблеме.

Процесс управления был запрограммирован на реагирование на сигналы ctrl-C и ctrl-break. Это прекрасно работает, когда процесс запускается вручную в консоли, где у нас есть доступ к консоли, и можем "напечатать" ctrl-c или ctrl-break в окне консоли. Однако, как уже упоминалось, процессы обычно выполняются как запланированные задачи без окон. Следовательно, мы не можем "напечатать" что-либо в несуществующем окне консоли. Поскольку они являются консольными процессами, которые выполняются без процесса входа в систему, они также должны иметь возможность выполняться в среде без окон. Итак, как нам настроить процесс для прослушивания сигнала выключения?

Хотя процесс действительно прослушивает сигналы ctrl-C и ctrl-break, я не вижу способа отправить этот сигнал процессу. Это кажется фундаментальной проблемой в Windows, или я ошибаюсь? Я знаю о SendSignal.exe, но пока не смог заставить его работать. Это терпит неудачу следующим образом:

>SendSignal 26320
Sending signal to process 26320...
CreateRemoteThread failed with 0x00000005.
StartRemoteThread failed with 0x00000005.
0x00000005 == Access is denied.

Попытка "taskkill" без -F приводит к:

>taskkill /PID 24840
ERROR: The process with PID 24840 could not be terminated.
Reason: This process can only be terminated forcefully (with /F option). 

Все другие функции "kill" немедленно убивают процесс, а не отправляют сигнал.

Одним из возможных решений могло бы стать решение, основанное на наблюдении за файлами: создать часы для некоторой модификации определенного файла. Но это взлом, и мы бы предпочли сделать это с соответствующей сигнализацией. Кто-нибудь решил эту проблему? Кажется, что это очень базовая функциональность, и это, безусловно, тривиально сделать в среде Unix. Конечно, Microsoft предоставила НЕКОТОРЫЙ механизм, позволяющий полностью завершить работу исполняемого файла без окон?

Мне известна ветка ниже, чей вопрос практически идентичен (за исключением спецификации того, почему нужен ответ, то есть, почему нужно делать это для процесса без окон, без консоли), но ответа нет есть исключение для "использования SendSignal", которое, как я уже сказал, у нас не работает:

Могу ли я отправить Ctrl-C (SIGINT) в приложение в Windows?

Есть и другие подобные вопросы, но пока нет ответов.

Любая помощь приветствуется.

0 ответов

[Обновление комментария Анона к ответу для наглядности]

windows-kill работал отлично и сумел решить проблемы отказа в доступе, с которыми столкнулся SendSignal. Привилегированный пользователь должен, конечно, запустить его.

windows-kill также поддерживает сигналы ctrl-c и ctrl-break.

Другие вопросы по тегам