В нашей группе есть длительные процессы, которые выполняются ежедневно. Процессы обычно начинаются в 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?
Есть и другие подобные вопросы, но ответов пока нет.
Любая помощь приветствуется.
SendSignal.exe
, вы можете попробовать windows-kill, но я не знать, если это будет работать лучше для вас. Ваша проблема может заключаться в том, что пользователь, который хочет совершить убийство, отличается от пользователя, запускающего ваши длительные процессы... - person Anon   schedule 17.03.2018GenerateConsoleCtrlEvent
- person Marcono1234   schedule 25.07.2019