it-swarm-id.com

Python memeriksa apakah suatu proses sedang berjalan atau tidak

Saya mencoba membuat skrip python yang nantinya akan saya jalankan sebagai layanan. Sekarang saya ingin menjalankan bagian tertentu dari kode hanya ketika iTunes sedang berjalan. Saya mengerti dari beberapa penelitian bahwa polling seluruh daftar perintah dan kemudian mencari aplikasi untuk daftar itu mahal. 

Saya menemukan bahwa proses pada sistem operasi berbasis UNIX membuat file kunci untuk memberitahukan bahwa suatu program sedang berjalan, pada titik mana kita dapat menggunakan os.stat(location_of_file) untuk memeriksa apakah file tersebut ada untuk menentukan apakah suatu program sedang berjalan atau tidak.

Apakah ada file kunci serupa yang dibuat pada Windows?

Jika tidak, apa saja beragam cara dalam Python yang dengannya kita dapat menentukan apakah suatu proses sedang berjalan atau tidak?

Saya menggunakan antarmuka python 2.7 dan iTunes COM.

25
nightf0x

Anda tidak dapat mengandalkan file kunci di Linux atau Windows. Saya hanya akan menggigit peluru dan beralih ke semua program yang sedang berjalan. Saya benar-benar tidak percaya itu akan menjadi "mahal" seperti yang Anda pikirkan. psutil adalah kabel modul python lintas-platform yang luar biasa untuk penghitungan semua program yang berjalan pada suatu sistem.

import psutil    
"someProgram" in (p.name() for p in psutil.process_iter())
36
Mark

File kunci umumnya tidak digunakan pada Windows (dan jarang pada Unix). Biasanya ketika program Windows ingin melihat apakah instance lain sudah berjalan, ia akan memanggil FindWindow dengan judul atau nama kelas yang dikenal.

def iTunesRunning():
    import win32ui
    # may need FindWindow("iTunes", None) or FindWindow(None, "iTunes")
    # or something similar
    if FindWindow("iTunes", "iTunes"):
        print "Found an iTunes window"
        return True
6
Gabe

Meskipun @zeller mengatakan ini sudah ada di sini adalah contoh cara menggunakan tasklist. Karena saya hanya mencari Vanilla python alternatif ...

import subprocess

def process_exists(process_name):
    call = 'TASKLIST', '/FI', 'imagename eq %s' % process_name
    # use buildin check_output right away
    output = subprocess.check_output(call)
    # check in last line for process name
    last_line = output.strip().split('\r\n')[-1]
    # because Fail message could be translated
    return last_line.lower().startswith(process_name).lower()

dan sekarang kamu bisa melakukan:

>>> process_exists('Eclipse.exe')
True

>>> process_exists('AJKGVSJGSCSeclipse.exe')
False

Untuk menghindari menelepon beberapa kali dan memiliki ikhtisar dari semua proses dengan cara ini Anda bisa melakukan sesuatu seperti:

# get info dict about all running processes
call = 'TASKLIST', '/FO', 'CSV'
output = subprocess.check_output(call)
# get rid of extra " and split into lines
output = output.replace('"', '').split('\r\n')
keys = output[0].split(',')
proc_list = [i.split(',') for i in output[1:] if i]
# make dict with proc names as keys and dicts with the extra nfo as values
proc_dict = dict( [( i[0], dict(Zip(keys[1:], i[1:])) ) for i in proc_list] )
print(proc_dict.keys())
5
ewerybody

Psutil disarankan oleh Mark , benar-benar solusi terbaik, satu-satunya kelemahan adalah lisensi yang kompatibel dengan GPL. Jika itu masalah, maka Anda dapat menjalankan perintah info proses Windows: wmic process di mana WMI tersedia (XP pro, Vista, win7) atau tasklist. Berikut adalah deskripsi untuk melakukannya: Bagaimana memanggil program eksternal dengan python dan mengambil kode output dan return? (bukan satu-satunya cara yang mungkin ...)

3
zeller

win32ui.FindWindow(classname, None) mengembalikan pegangan jendela jika ada jendela dengan nama kelas yang diberikan ditemukan. Itu memunculkan window32ui.error sebaliknya.

import win32ui

def WindowExists(classname):
    try:
        win32ui.FindWindow(classname, None)
    except win32ui.error:
        return False
    else:
        return True

if WindowExists("DropboxTrayIcon"):
    print "Dropbox is running, sir."
else:
    print "Dropbox is running..... not."

Saya menemukan bahwa nama kelas jendela untuk ikon baki Dropbox adalah DropboxTrayIcon menggunakan Autohotkey Window Spy.

Lihat juga

MSDN FindWindow

3
Jisang Yoo

Saya ingin menambahkan solusi ini ke daftar, untuk tujuan historis. Ini memungkinkan Anda untuk mencari tahu berdasarkan .exe bukan judul jendela, dan juga mengembalikan memori yang digunakan & PID.

processes = subprocess.Popen('tasklist', stdin=subprocess.PIPE, stderr=subprocess.PIPE, stdout=subprocess.PIPE).communicate()[0]
# Put a regex for exact matches, or a simple 'in' for naive matches

Sepotong contoh output:

notepad.exe                  13944 Console                    1     11,920 K
python.exe                    5240 Console                    1     28,616 K
conhost.exe                   9796 Console                    1      7,812 K
svchost.exe                   1052 Services                   0     18,524 K
iTunes.exe                    1108 Console                    1    157,764 K
3
std''OrgnlDave

Jika tidak dapat mengandalkan nama proses seperti skrip python yang akan selalu memiliki python.exe sebagai nama proses. Jika ditemukan metode ini sangat berguna

import psutil
psutil.pid_exists(pid)

periksa dokumen untuk info lebih lanjut http://psutil.readthedocs.io/en/latest/#psutil.pid_exists

2
MNIF AKRAM

Apakah Anda senang dengan perintah Python Anda menjalankan program lain untuk mendapatkan info?

Jika demikian, saya sarankan Anda melihat PsList dan semua opsi. Sebagai contoh, Berikut ini akan memberi tahu Anda tentang proses menjalankan iTunes

PsList iTunes

Jika Anda bisa mengetahui cara menafsirkan hasil, semoga ini akan membantu Anda.

Edit:

Ketika saya tidak menjalankan iTunes, saya mendapatkan yang berikut:

pslist v1.29 - Sysinternals PsList
Copyright (C) 2000-2009 Mark Russinovich
Sysinternals

Process information for CLARESPC:

Name                Pid Pri Thd  Hnd   Priv        CPU Time    Elapsed Time
iTunesHelper       3784   8  10  229   3164     0:00:00.046     3:41:05.053

Dengan iTunes yang berjalan, saya mendapatkan baris tambahan ini:

iTunes              928   8  24  813 106168     0:00:08.734     0:02:08.672

Namun, perintah berikut hanya mencetak info tentang program iTunes itu sendiri, yaitu dengan argumen -e:

pslist -e iTunes
2
Clare Macrae

Ini bekerja dengan baik

def running():
    n=0# number of instances of the program running 
    prog=[line.split() for line in subprocess.check_output("tasklist").splitlines()]
    [prog.pop(e) for e in [0,1,2]] #useless 
    for task in prog:
        if task[0]=="iTunes.exe":
            n=n+1
    if n>0:
        return True
    else:
        return False
0