Компьютерный форум OSzone.net  

Компьютерный форум OSzone.net (http://forum.oszone.net/index.php)
-   Скриптовые языки администрирования Windows (http://forum.oszone.net/forumdisplay.php?f=102)
-   -   [решено] Присвоение pid'a процессу при запуске. (http://forum.oszone.net/showthread.php?t=244087)

Паркан 06-10-2012 23:22 2000654

Присвоение pid'a процессу при запуске.
 
Можно ли при запуске программы через командную строку при помощи start присваевать PID этому процессу?
А дело вот в чем: Есть несколько одинаковых файлов(приложений), названия которых тоже совпадают. С запуском проблем нет.
А вот с прекращением их работы есть. По названию их не остановить, т.к. 3 одинаковых названия. А по PID - его надо каждый раз узнавать.
Нельзя ли разу присваевать этот пид процессу?

Iska 07-10-2012 03:41 2000734

Цитата:

Цитата Паркан
Можно ли при запуске программы через командную строку при помощи start присваевать PID этому процессу? »

Нет.

Можно получать PID при запуске. Затем использовать его при завершении процесса. Рассказывайте детали: что за приложения, как и когда запускаются, как и когда завершаются.

Паркан 07-10-2012 22:37 2001112

Типичное exe приложение серверного типа.
Запускаю при помощи start. Завершение через taskkill при помощи PID.

А вообе суть такая: Есть многопользовательский сайт на php,где в интерфейсе кнопки: старт, стоп.
При клике Старт формируется файл start.cmd, который содержит путь к запускаемому файлу, и сам запус этого файла, после exit и cmd.exe прекращает работу. Все было нормально, пока работало одно приложение. Но при запуске 2 и более уже по названию не отключить. Вот, хотел бы реализовать таким же образом его остановку: при клике на Стоп сайт формирует файл stop.exe, где содержит остановку процесса по PID.
p.s. Если получать Pid при запуске возникает еще одна проблема: как cmd.exe отправить php данные о pid'e, что бы тот знал какой именно PID принадлежит пользователю.

Iska 08-10-2012 01:46 2001156

Паркан, сожалею, но с php помочь Вам не смогу. Насколько я понимаю, нажимают кнопки на клиенте, а приложение должно запускаться и останавливаться на сервере, так? Сеть глобальная или локальная? Как и где предполагаете хранить PID? Как планируется осуществлять идентификацию клиента, как — соотносить его с уже запущенным приложением (если, например, клиент просто запустит приложение и, не остановив его, выйдет; снова зайдёт, запустит и выйдет и т.д.)?

В общем и целом, думаю, задача в этом случае должна решаться именно средствами php, хотя беглый поиск наводит на странные мысли на этот счёт.

Общий принцип запуска приложения и получения его PID (на WSH):
Код:

Option Explicit

Dim objWshShell
Dim objWshExec

Set objWshShell = WScript.CreateObject("WScript.Shell")
Set objWshExec  = objWshShell.Exec("notepad.exe")

WScript.Echo objWshExec.ProcessID

Set objWshExec  = Nothing
Set objWshShell = Nothing

WScript.Quit 0

Или (специально избыточный вариант для «особых» языков, типа LISP и т.п.):
Код:

Option Explicit

Dim strComputer

Dim objSWbemLocator
Dim objSWbemServicesEx
Dim objSWbemObjectEx
Dim objSWbemMethod
Dim objSWbemObjectEx_InParameters
Dim objSWbemObjectEx_OutParameters

strComputer = "."

Set objSWbemLocator                = WScript.CreateObject("WbemScripting.SWbemLocator")
Set objSWbemServicesEx            = objSWbemLocator.ConnectServer(strComputer, "root\cimv2")
Set objSWbemObjectEx              = objSWbemServicesEx.Get("Win32_Process")
Set objSWbemMethod                = objSWbemObjectEx.Methods_.Item("Create")
Set objSWbemObjectEx_InParameters  = objSWbemMethod.InParameters.SpawnInstance_()

objSWbemObjectEx_InParameters.Properties_.Item("CommandLine").Value = "notepad.exe"

Set objSWbemObjectEx_OutParameters = objSWbemObjectEx.ExecMethod_(objSWbemMethod.Name, objSWbemObjectEx_InParameters)

WScript.Echo objSWbemObjectEx_OutParameters.Properties_.Item("ProcessID").Value

Set objSWbemObjectEx_OutParameters = Nothing
Set objSWbemObjectEx_InParameters  = Nothing
Set objSWbemMethod                = Nothing
Set objSWbemObjectEx              = Nothing
Set objSWbemServicesEx            = Nothing
Set objSWbemLocator                = Nothing

WScript.Quit 0

Имею в виду, что Вы переведёте WSH на php по типу:
Код:


$oSWbemLocator = new COM("WbemScripting.SWbemLocator");

Что и как Вы с полученным PID будете делать дальше — зависит от ответов на заданные в начале поста вопросы.

Завершение процесса по известному PID, например, переданному единственным аргументом:
Код:

Option Explicit

Dim strPID
Dim strComputer

Dim objSWbemLocator
Dim objSWbemServicesEx
Dim objSWbemObjectEx
Dim objSWbemObjectEx_InParameters


strPID = WScript.Arguments.Item(0)
strComputer = "."

Set objSWbemLocator                = WScript.CreateObject("WbemScripting.SWbemLocator")
Set objSWbemServicesEx            = objSWbemLocator.ConnectServer(strComputer, "root\cimv2")
Set objSWbemObjectEx              = objSWbemServicesEx.Get("Win32_Process.Handle='" & strPID & "'")
Set objSWbemObjectEx_InParameters  = objSWbemObjectEx.Methods_.Item("Terminate").InParameters.SpawnInstance_()

objSWbemObjectEx.ExecMethod_ "Terminate", objSWbemObjectEx_InParameters

Set objSWbemObjectEx_InParameters  = Nothing
Set objSWbemObjectEx              = Nothing
Set objSWbemServicesEx            = Nothing
Set objSWbemLocator                = Nothing

WScript.Quit 0

Не думаю, что изложенное Вам особо пригодится. Рекомендуется сначала ответить для себя на вопросы, изложенные в начале поста, затем делать реализацию на php.

Паркан 09-10-2012 00:01 2001750

Цитата:

Цитата Iska
Сеть глобальная или локальная? »

Глобальная.
Цитата:

Цитата Iska
Как и где предполагаете хранить PID? »

Есть база данных mysql. И поля, логин, пасс, и т.д., в том числе pid.
Цитата:

Цитата Iska
Как планируется осуществлять идентификацию клиента, как — соотносить его с уже запущенным приложением (если, например, клиент просто запустит приложение и, не остановив его, выйдет; снова зайдёт, запустит и выйдет и т.д.)? »

Идентификация на сайте - логин, пароль. После чего из БД извлекается вся информация о клиенте, так же и порт его сервера. То есть структура папок серверов для пользователей ../server/port/сами файлы сервера.С запуском сервера проблем нету. Как через php, так и через cmd.exe. А именно php формирует файл start.cmd, в котором он изменяет порт сервера. И уже ком.строка переходит в нужную папку, запускает приложение и завершает свою работу. У пользователя пишет - сервер запущен, все ок, это работает.
Ну вот дальше проблема: как выключить? В cmd.exe можно использовать PID процесса. В php сформировать функцию выключения организовать не проблема. Но проблема в том, что я не знаю какой именно сервер вырубить.
Приложение способно работать даже когда клиент покинет сайт, т.е. в качестве мини сервера, разве что если он не упадет сам. Но иногда клиенту может понадобиться перезагрузка его сервера - вот тогда то и возникают, как вы понимаете, проблемы с выбором сервера, который надо выключить.

Iska 09-10-2012 03:31 2001823

Паркан, если пользователю позволено иметь запущенным только один процесс (от которого и нужен PID) — то всё достаточно просто: привязывайте к паре логин/пароль и полученный PID.

Цитата:

Цитата Паркан
С запуском сервера проблем нету. Как через php, так и через cmd.exe. А именно php формирует файл start.cmd, в котором он изменяет порт сервера. И уже ком.строка переходит в нужную папку, запускает приложение и завершает свою работу. У пользователя пишет - сервер запущен, все ок, это работает. »

Зачем нужен промежуточный «start.cmd»? Почему не делать это просто из php?


Время: 03:02.

Время: 03:02.
© OSzone.net 2001-