Безопасно убить процесс из .bat файла - PullRequest
1 голос
/ 15 октября 2008

У меня есть приложение VB6, которое необходимо обновить самостоятельно. Для этого премьер-министр рекомендовал использовать пакетный файл, который должен быть запущен из приложения. Пакетный файл должен завершить процесс, загрузить новую версию с локального сервера, перезаписать старые файлы и снова запустить приложение.
Моя проблема с этим заключается в том, что я не уверен, что taskkill возвращает контроль над родителем только после того, как процесс был завершен и все использованные ресурсы были освобождены; в частности, нам было интересно, что происходит с файлом .exe процесса. Есть ли гарантия, что он будет разблокирован после возвращения TaskKill? - конечно, теоретически он не должен блокироваться каким-либо другим процессом, это единственный случай, который нас интересует.

Ответы [ 4 ]

1 голос
/ 15 октября 2008

Я делаю это, позволяя приложению проверять наличие обновлений. Если есть, то приложение загружает их во временное место. После этого он запустит (.js) скрипт и выйдет из приложения. Этот сценарий будет ожидать закрытия процесса (сна), скопировать обновления и снова запустить приложение.

Таким образом, у вас гораздо меньше логики в сценарии, и вы можете выполнять свои действия в среде, в которой доступно больше инструментов.

1 голос
/ 15 октября 2008

Если процесс убит, то исполняемый файл будет освобожден для обновления. В качестве альтернативы использованию taskkill вы можете использовать pskill от sysinternals, но taskkill должен отлично работать с параметром / IM.

Однако ни pskill, ни taskkill не будут ждать остановки процесса перед возвратом управления. Так что вам придется следить за процессами, чтобы убедиться, что они больше не работают.

Кроме того, и это было бы моим предпочтительным решением, можно развернуть приложение vb6 с помощью однократного нажатия, что автоматически обновит приложение новыми выпусками. Проверьте эту статью для деталей.

Что касается ресурсов, открытых процессом, то возможно, что они могут оставаться открытыми (например, соединение SQL), но, скорее всего, они будут успешно закрыты. Вы сможете точно знать, только наблюдая за тем, что происходит, тестируя Taskkill на этом процессе.

Надеюсь, это поможет.

0 голосов
/ 15 октября 2008

Taskkill должен возвращаться только после завершения процесса (согласно комментариям ниже: используйте флаг / F для принудительного завершения программы, если он ожидает ввода пользователя).

Чтобы узнать больше об этом, вы можете использовать Обозреватель процессов и точно знать, когда процесс будет завершен, а также, если у кого-то еще открыт файл .exe (Ctrl + F и имя exe) - но это не должно быть так.

0 голосов
/ 15 октября 2008

Параметр командной строки, например / Shutdown, будет обрабатываться программой VB.

MyApp.exe / Завершение работы

/ Параметр Shutdown найдет существующий запущенный экземпляр приложения (используя FindWindow API) и отправит пользовательское сообщение в окно с просьбой о плавном завершении работы.

...