pythonベースのモニタプログラムが閉じられていますか?


この文章は主にpythonに基づいてプログラムを監視して閉じるかどうかを紹介しています。ここではサンプルコードによって紹介された非常に詳細で、皆さんの学習や仕事に対して一定の参考学習価値を持っています。必要な友達は下記を参照してください。
一つのサービス系exeを監視して、彼が閉じた後に印刷したいですが、win 32 process.EnumProcess()を使ってすべてのプログラムのpidを取得して、pidによって取得したプロセス名を比較して、プログラムが閉じられているかどうかを判断します。また、c++の例を探しに行きたいですが、c++のapi関数はpythonには存在しません。以前にこのような問題があったら、ほぼwmiを使って解決します。

 import wmi
   c = wmi.WMI()
   for process in c.Win32_Process():
     print process.ProcessId, process.Name
しかし、wmiの速度は意外に遅いです。本当に合わないです。
最後に外で例を探します。この問題をよく解決できます。

from win32com.client import GetObject
  _wmi = GetObject('winmgmts:')

  # collect all the running processes
  processes = _wmi.ExecQuery('Select * from win32_process')
  for p in processes:

      print((p.ProcessId, p.ExecutablePath, p.CommandLine, p.Name))
このすべてのコードは

def wmi_sql_all_name(pname):#      
  from win32com.client import GetObject
  _wmi = GetObject('winmgmts:')
  processes = _wmi.ExecQuery('Select * from win32_process')
  for p in processes:
    if p.name==pname:
      return p.ProcessId
def process_restat(pname):
  import win32security, win32event#-----------------------------------------    
  hToken = win32security.OpenProcessToken(win32api.GetCurrentProcess(),
                      win32con.TOKEN_ADJUST_PRIVILEGES | win32con.TOKEN_QUERY) #          
  luid = win32security.LookupPrivilegeValue(None, 'SeDebugPrivilege') #        ,        
  PyTOKEN = ((luid, win32con.SE_PRIVILEGE_ENABLED),) #            
  pyt1 = win32security.AdjustTokenPrivileges(hToken, 0, PyTOKEN) #     #----------------------------------------
  processid=wmi_sql_all_name(pname)
  if processid!= None:
    hprocess = win32api.OpenProcess(win32con.PROCESS_ALL_ACCESS, False, processid)
    win32event.WaitForSingleObject(hprocess, -1)
    win32api.CloseHandle(hprocess)
    print U'   '
  else:
    print u'   '
まずトークンを取得する必要があります。そうでないと、多くのサービスまたはシステムプロセスの情報を取得するには、権限が足りません。
OpenProcessを使ってプログラムのハンドルを取得し、
WaitForSingleObjectを使用してプログラムの通知された状態、すなわち運転状態を取得します。第二のパラメータは待ち時間-1は永久待ちです。
この関数はスレッドがデッドロックされますが、cpuは使われません。子スレッドに捨てるのに適しています。無限ループのリストよりずっと効率的です。
---------------
急にsqlの言葉があると思いましたが、なぜ循環しますか?

def wmi_sql_all_name(pname):
  from win32com.client import GetObject

  _wmi = GetObject('winmgmts:')
  processes = _wmi.ExecQuery("Select * from win32_process where name= '%s'"%(pname))
  try:
    return processes[0].ProcessId
  except:
    print u"      "
    return None
wmi_をsqlall_nameメソッドを以上に変更しました。
以上が本文の全部です。皆さんの勉強に役に立つように、私たちを応援してください。