Как в 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). 

Все остальные функции «уничтожения» немедленно уничтожают процесс, а не отправляют сигнал.

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

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

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

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

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


person David I. McIntosh    schedule 05.08.2014    source источник
comment
msdn.microsoft.com/ en-us/library/windows/desktop/   -  person Hans Passant    schedule 05.08.2014
comment
В отправленной вами ссылке ключевой строкой является Только те процессы в группе, которые используют ту же консоль, что и вызывающий процесс, получают сигнал. Подразумевается, что GenerateConsoleCtrlEvent бесполезен и не является решением моей проблемы выше.   -  person David I. McIntosh    schedule 08.08.2014
comment
Поздравляю, теперь вы понимаете, почему следовать этому подходу бессмысленно. Очищает ваш разум, чтобы найти правильное решение, используйте именованное событие или конвейер для сигнализации процесса.   -  person Hans Passant    schedule 08.08.2014
comment
Я понимаю, что GenerateConsoleCtrlEvent бесполезен. То, что я видел, говорит мне о том, что, похоже, нет никакого способа сигнализировать процессу с помощью CTRL_BREAK_EVENT, и вы, кажется, подтверждаете это. Но я просто до сих пор в шоке - неужели MS была настолько тупа, что не предоставила этот функционал, или я что-то упускаю? Я не уверен, что использование конвейера было бы полезно, потому что мы никогда не знаем, придется ли нам сигнализировать о процессе (обычно мы этого не делаем), но, возможно, я не понимаю вашего предложения. Предложение именованного события звучит, возможно, интригующе, спасибо за это.   -  person David I. McIntosh    schedule 08.08.2014
comment
ты уже нашел решение? Я сталкиваюсь с той же проблемой, что и вы.   -  person Sabin    schedule 09.03.2017
comment
Нет. В конце концов, мы используем сигнальный файл — процесс создает файл и время от времени проверяет его наличие. Удаление файла является сигналом к ​​завершению процесса. В некотором смысле это невероятно уродливо. С другой стороны, мы можем удаленно остановить процесс, просто удалив файл — нет необходимости запускать процесс на работающей машине. Так что в этом есть свои плюсы. Тем не менее, я все еще убежден, что это можно сделать, и у меня просто не было времени, чтобы понять это.   -  person David I. McIntosh    schedule 15.03.2017
comment
Если вы хотите попробовать альтернативу SendSignal.exe, вы можете попробовать windows-kill, но я не знать, если это будет работать лучше для вас. Ваша проблема может заключаться в том, что пользователь, который хочет совершить убийство, отличается от пользователя, запускающего ваши длительные процессы...   -  person Anon    schedule 17.03.2018
comment
Вы можете попробовать это решение, которое использует GenerateConsoleCtrlEvent   -  person Marcono1234    schedule 25.07.2019


Ответы (1)


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

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

windows-kill также поддерживает сигналы Ctrl-C и Ctrl-Break.

person aybassiouny    schedule 27.12.2018