В Windows, как я могу изящно попросить работающую программу завершить работу?

В Unix или Linux легко изящно попросить завершить работающее приложение: вы посылаете ему сигнал SIGTERM. Если его идентификатор процесса 1234, вы можете просто запустить kill 1234 или же kill -s TERM 1234 или же kill -15 1234,

Как я могу сделать то же самое в Windows?

Если я правильно помню, функция "Завершить задачу" в диспетчере задач (а не функция "Завершить процесс") использовалась для выполнения того, что я хочу. Но, начиная с Windows 8.1, это уже не так нежно; когда я использую эту функцию, это приводит к потере несохраненных данных.

Я не хочу писать код для этого. Если бы я это сделал, я бы спросил о переполнении стека.:)

3 ответа

Решение

Taskkill.exe

Энди Э пишет, что вы можете использовать taskkill.exe,

Чтобы завершить процесс с идентификатором процесса 1234:

taskkill /pid 1234

Чтобы прекратить notepad.exe:

taskkill /im notepad.exe

Для получения дополнительной помощи:

taskkill /?

Он добавляет:

/f Параметр switch будет принудительно уничтожать, но если его не использовать, он просто отправляет сигнал завершения, поэтому приложение корректно закрывается.

Он прав. Я пытался использовать taskkill.exe (без /f), чтобы прекратить Notepad, и он работал как ожидалось. Блокнот спросил меня, хочу ли я сохранить несохраненный текст, который я ввел.

Я использую домашнюю версию Windows 8.1. Это выглядит как taskkill.exe пришел в комплекте с Windows без дополнительной оплаты. Оно в c:\windows\system32,

Или просто выйти

Если вы не хотите беспокоиться об этом, просто выйдите из своей учетной записи Windows, затем войдите снова.

Консольные приложения

Что касается консольных приложений (например, PowerShell), Крис Бекке добавляет:

Нет реального способа изящно закрыть консольные приложения в Windows. Им нужно поддерживать какой-то изящный закрытый механизм.

Ты можешь использовать rmlogotest.exe (Инструмент тестирования логотипа Restart Manager). Эта бесплатная утилита, написанная Microsoft, является частью Windows App Certification Kit.

Чтобы получить последнюю версию Windows App Certification Kit, загрузите и запустите установщик Windows SDK. (Вы можете найти последнюю версию установщика Windows SDK, выполнив поиск в Google.) Снимите все флажки, кроме поля Windows App Certification Kit. Подождите, пока комплект будет загружен и установлен. Если я правильно помню, комплект составляет пару сотен мегабайт.

rmlogotest.exe вероятно будет в C:\Program Files (x86)\Windows Kits\10\App Certification Kit если вы используете версию 10 Windows SDK.

Откройте командную строку. Перейдите в правильный каталог. Войти rmlogotest затем пробел, затем идентификационный номер процесса.

Если процесс "Перезапустить менеджер в курсе", rmlogotest изящно перезапустит его и сообщит вам "Проверка логотипа пройдена". Иначе, rmlogotest попросит его прекратить грациозно, а затем может сказать "Ошибка проверки логотипа".

Я пытался с помощью rmlogotest.exe прекратить Notepad, и он работал как ожидалось. Блокнот спросил меня, хочу ли я сохранить несохраненный текст, который я ввел.

(Если вам интересно, что такое Restart Manager, и позвольте мне объяснить. Restart Manager является частью Windows и используется установщиком Windows 4.0 и более поздними версиями. Когда установщику Windows требуется перезаписать или удалить открытый файл, он использует три пошаговый процесс. Он сообщает Restart Manager о необходимости корректно завершить процесс, использующий файл. Он перезаписывает файл. Затем он сообщает Restart Manager о необходимости запустить процесс снова.)

GnuWIN32 имеет порты Windows с общими утилитами Linux, включая kill.exe

http://gnuwin32.sourceforge.net/

Поддерживаются следующие сигналы по имени или номеру

λ kill -l                                                                                                                                                                                                                                                                
INT                                                                                                                                                                                                                                                                      
ILL                                                                                                                                                                                                                                                                      
FPE                                                                                                                                                                                                                                                                      
KILL                                                                                                                                                                                                                                                                     
SEGV                                                                                                                                                                                                                                                                     
TERM                                                                                                                                                                                                                                                                     
CHLD                                                                                                                                                                                                                                                                     
ABRT             
Другие вопросы по тегам