У меня есть приложение VB6, которое необходимо обновить. Для этого ПМ рекомендовал использовать пакетный файл, который нужно запускать из приложения. Пакетный файл должен убить процесс, загрузить новую версию с локального сервера, перезаписать старые файлы и снова запустить приложение.
Моя проблема в том, что я не уверен, что taskkill возвращает контроль над родителем только после процесс был убит, и все используемые ресурсы были освобождены; в частности, нам было интересно, что происходит с файлом .exe процесса. Есть ли гарантия, что он будет разблокирован после возвращения Taskkill? - конечно, теоретически он не должен быть заблокирован никаким другим процессом, это единственный случай, который нас интересует.
Безопасно убить процесс из файла .bat
Ответы (4)
Если процесс будет убит, то exe будет освобожден для обновления. В качестве альтернативы использованию taskkill вы можете использовать pskill от sysinternals, но taskkill должен прекрасно работать с параметром /IM.
Однако ни pskill, ни taskkill не будут ждать остановки процесса, прежде чем вернуть управление. Таким образом, вам придется следить за процессами, чтобы убедиться, что они больше не работают.
Кроме того, и это было бы моим предпочтительным решением, можно развернуть приложение vb6 с помощью однократного щелчка, что автоматически обновит приложение новыми выпусками. Подробнее см. в этой статье.
Что касается ресурсов, открытых процессом, то, возможно, они останутся открытыми (например, sql-соединение), но, скорее всего, они будут успешно закрыты. Вы сможете узнать наверняка, только наблюдая за тем, что происходит, тестируя taskkill в процессе.
Надеюсь, это поможет.
Я делаю это, позволяя самому приложению проверять наличие обновлений. Если они есть, то приложение загружает их во временное место. После этого он запустит скрипт (.js) и выйдет из приложения. Этот скрипт будет ждать, пока процесс закроется (перейдет в спящий режим), скопирует обновления и снова запустит приложение.
Таким образом, у вас будет гораздо меньше логики в сценарии, и вы сможете делать свои вещи в среде, в которой у вас больше доступных инструментов.
Имейте параметр командной строки, такой как /Shutdown, который будет обрабатывать программа VB.
MyApp.exe /Выключение
Параметр /Shutdown найдет существующий работающий экземпляр приложения (используя FindWindow API) и отправит пользовательское сообщение окну с запросом на плавное завершение работы.
Taskkill должен возвращаться только после завершения процесса (согласно комментариям ниже: используйте флаг /F для принудительного завершения программы, если она ожидает ввода данных пользователем).
Чтобы узнать больше об этом, вы можете использовать Обозреватель процессов и увидеть, когда именно процесс завершается, а также если у кого-то еще открыт файл .exe (Ctrl + F и имя exe) - но этого не должно быть.
it does if you use the /F flag Это небезопасное убийство, о чем ясно говорит вопрос.
- person Synetech; 09.01.2013