İşlemin çalışıp çalışmadığı kontrol ediliyor. Bir işlemin toplu iş komut dosyası aracılığıyla çalışıp çalışmadığını kontrol etme

İşlemin çalışıp çalışmadığı kontrol ediliyor. Bir işlemin toplu iş komut dosyası aracılığıyla çalışıp çalışmadığını kontrol etme

WMIC ve TASKLIST araçlarını seviyorum, ancak Windows'un ev/ana sürümlerinde mevcut değiller.Başka bir yol da hemen hemen her pencere makinesinde bulunan QPROCESS komutlarını kullanmaktır (terminal servisleri olanlar için - SP2 olmadan sadece XP kazanacağını düşünüyorum) , yani pratik olarak her pencere makinesi):

@echo off:check_process setlocal if "%~1" equ "" echo işlem adını forst argümanı olarak iletin && çıkış /b 1:: ilk argüman, set process_to_check=%~1:: QPROCESS çalışıyorsa kontrol etmek istediğiniz süreçtir çalışan sürecin sadece ilk 12 sembolünü gösterebilir:: Başka bir araç kullanılırsa aşağıdaki satır silinebilir set process_to_check=%process_to_check:~0.12% QPROCESS * | /i "%process_to_check%" >nul 2>'yi bulun

QSÜRECİ komut, TASKLIST kadar güçlü değildir ve işlem adının yalnızca 12 karakterini görüntülemekle sınırlıdır, ancak TASKLIST mevcut değilse dikkate alınmalıdır.

If process adını argüman olarak kullandığı daha basit bir kullanım (bu durumda yürütülebilir dosyanın adını ilettiğinizde .exe soneki zorunludur):

@echo off:check_process setlocal if "%~1" equ "" echo işlem adını forst argümanı olarak iletin && çıkış /b 1:: ilk argüman kontrol etmek istediğiniz işlemdir:: .exe soneki çalışıyorsa zorunlu set " process_to_check=%~1" QPROCESS "%process_to_check%" >nul 2>&1 && (yankı işlemi %process_to_check% çalışıyor) || (yankı işlemi %process_to_check% çalışmıyor) endlocal

QPROCESS'i kullanmanın iki yolu arasındaki fark, QPROCESS *'in tüm işlemleri listelemesi, QPROCESS some.exe'nin ise yalnızca şu işlemleri filtrelemesidir: şu anki kullanıcı.

WMI nesnelerini WMIC yerine windows script host exe aracılığıyla kullanmak da bir seçenektir. Ayrıca hepsinde çalışmalı Windows makineleri(WSH'nin devre dışı bırakıldığı durumlar hariç, ancak bu nadir bir durumdur). İşte WMI sınıfları aracılığıyla tüm işlemleri listeleyen ve yukarıdaki komut dosyasında QPROCESS yerine kullanılabilen bir yarasa dosyası (bu bir JScript/BAT melezidir ve olması gerekir) .bat olarak kaydedildi):

@if (@X)==(@Y) @end /* JSCRIPT YORUM ** @echo off cscript //E:JScript //nologo "%~f0" çıkış /b ********** **** JSCRIPT YORUMUNUN sonu **/ var winmgmts = GetObject("winmgmts:\\\\.\\root\\cimv2"); var colProcess = winmgmts.ExecQuery("Win32_Process'ten * seçeneğini seçin"); var süreçler = new Enumerator(colProcess); for (;!processes.atEnd();processes.moveNext()) ( var process=processes.item(); WScript.Echo(process.processID + " " + process.Name); )

Ve işlemin çalışıp çalışmadığını kontrol edecek bir değişiklik:

@if (@X)==(@Y) @end /* JSCRIPT YORUM ** @echo off if "%~1" equ "" echo işlem adını forst argümanı olarak iletin && çıkış /b 1:: ilk argüman set process_to_check=%~1 cscript //E:JScript //nologo "%~f0" | find /i "%process_to_check%" >nul 2>&1 && (yankı işlemi %process_to_check% çalışıyor) || (eko işlemi %process_to_check% çalışmıyor) /b ************** JSCRIPT COMMENT sonu **/ var winmgmts = GetObject("winmgmts:\\\\.\\root \\cimv2"); var colProcess = winmgmts.ExecQuery("Win32_Process'ten * seçeneğini seçin"); var süreçler = new Enumerator(colProcess); for (;!processes.atEnd();processes.moveNext()) ( var process=processes.item(); WScript.Echo(process.processID + " " + process.Name); )

TASKLIST'i olmayan makinelerde iki seçenek kullanılabilir.

Son teknik MSHTA tarafından kullanılır. Bu, XP'den sonraki tüm Windows makinelerinde çalışır ve Windows Komut Dosyası ana bilgisayar ayarlarından bağımsızdır. MSHTA çağrısı performansı biraz düşürebilir (yine yarasaya kaydedilmelidir):

@if (@X)==(@Y) @end /* JSCRIPT YORUM ** @echo off setlocal if "%~1" equ "" echo işlem adını forst argümanı olarak iletin && çıkış /b 1:: ilk argüman set process_to_check=%~1 mshta "about: çalıştırılıp çalıştırılmadığını kontrol etmek istediğiniz işlemdir:" | find /i "%process_to_check%" >nul 2>&1 && (yankı işlemi %process_to_check% çalışıyor) || (yankı işlemi %process_to_check% çalışmıyor) yerel çıkış /b ********* ***** JSCRIPT YORUMUNUN sonu **/ var fso= new ActiveXObject("Scripting.FileSystemObject").GetStandardStream(1); var winmgmts = GetObject("winmgmts:\\\\.\\root\\cimv2" ); var colProcess = winmgmts.ExecQuery("Win32_Process'ten * seçin"); var process'ler = new Enumerator(colProcess); for (;!processes.atEnd();processes.moveNext()) ( var process=processes.item( ); fso.Write(process.processID + " " + process.Name + "\n"); ) kapat();

İşlem kimliğine göre bir işlemin çalışıp çalışmadığını bulmaya çalışıyorum. Kod, forum gönderilerinden birine göre şöyle görünür. Aynı ad altında çalışan birden çok işlem olduğu için işlem adını göremiyorum.

Def findProcess(processId): ps= subprocess.Popen("ps -ef | grep "+processId, shell=True, stdout=subprocess.PIPE) output = ps.stdout.read() ps.stdout.close() ps. wait() çıktıyı döndürür def isProcessRunning(processId): output = findProcess(processId) eğer re.search(processId, output) Yok ise: true döndürür aksi takdirde: false döndürür 1111 72312 72311 0 0:00.00 ttys000 0:00.00 /bin/sh -c not -ef | grep 71676 1111 72314 72312 0 0:00.00 ttys000 0:00.00 grep 71676

Çıkış dizesinde işlem kimliğini bulabildiğinden her zaman doğru döndürür.

Baska öneri? Herhangi bir yardım için teşekkürler.

11 Çözüm, "Python'da (Linux/Unix'te) bir işlemin çalışıp çalışmadığını kontrol edin" için form web'i toplar

Denemek:

os.kill(pid, 0)

İşlem varsa başarılı olmalı (ve hiçbir şey yapmamalı) veya işlem yoksa (yakalayabileceğiniz) bir istisna atmalıdır.

Bence en basit cevap (belki de ideal değil) değişmek

Ps-ef | grep

İçin:

Ps-ef | grep | grep -v grep

Bu, bulmaya çalıştığınız işlemin PID'sini içeren işlemlerin grep arama listesini yok sayacaktır.

Görünüşe göre user9876'nın cevabı çok daha "Pythonic".

Biraz karışık ama *nix'te bir işlem kimliğinin olup olmadığını kontrol etmek için os.getpgid(pid) veya os.kill(pid, sig) kullanabilirsiniz.

os tanımını içe aktar is_process_running(process_id): deneyin: os.kill(process_id, 0) OSError dışında True döndür: False döndür

DÜZENLEME: Lütfen os.kill'in Windows'ta (Python 2.7'den itibaren) çalıştığını ve os.getpgid'in çalıştığını unutmayın. olmayacak . Ancak Windows sürümü"koşulsuz olarak süreci çıkmaya zorlayacak" TerminateProcess() öğesini çağırır, bu nedenle, varsa işlemi gerçekten öldürmeden ihtiyacınız olan bilgileri güvenli bir şekilde döndürmeyeceğini tahmin ediyorum.

Windows kullanıyorsanız, bu senaryoda bu çözümlerin hiçbiri kabul edilebilir olmadığından lütfen bize bildirin.

/proc/ klasörünün var olup olmadığını kontrol edebilirsiniz.

>>> import os.path >>> os.path.exists("/proc/0") False >>> os.path.exists("/proc/12") True

Bakınız: Bir işlem hala çalışıyorsa Linux'u Python ile nasıl kontrol edersiniz?

kullanmanın sakıncası yoksa harici modül, psutil'i öneririm. Platformlar arasıdır ve yalnızca mevcut süreci bulmak amacıyla bir alt kabuk oluşturmaktan daha kolay kullanılır.

Bu işlem aynı kullanıcıya aitse, işlemi kontrol edin, onu öldürmeyi deneyebilirsiniz. 0 sinyalini kullanırsanız, kill hiçbir şey göndermeyecek, ancak yine de işlemin uygun olup olmadığını size bildirecektir.

sig 0 ise, sinyal gönderilmez, ancak hata kontrolü yine de yapılır; bu, bir işlem kimliğinin veya işlem grubu kimliğinin varlığını kontrol etmek için kullanılabilir.

Bu, python yöntemlerine uygun şekilde yayılmalıdır.

Bunun eski olduğunu biliyorum ama bunu kullandım ve işe yarıyor gibi görünüyor; işlem adından işlem kimliğine dönüştürmeye hızla uyum sağlayabilirsiniz:

Deneyin: if len(os.popen("ps -aef | grep -i "işlemim" | grep -v "grep" | awk "( print $3 )"").read().strip().split("\ n")) > 1: İstisna dışında SystemExit(0) yükselt, e: e yükselt

Windows'ta başka bir seçenek de tasklist.exe'yi kullanmaktır:

Sözdizimi: tasklist.exe /NH/FI "PID eq processID"

Def IsProcessRunning(processId): ps= subprocess.Popen(r"tasklist.exe /NH /FI "PID eq %d"" % (processId), shell=True, stdout=subprocess.PIPE) output = ps.stdout.read () ps.stdout.close() ps.wait() çıktıda processId ise: True döndür False döndür

Windows'ta WMI kullanabilirsiniz.

Win32com.client'ten import GetObject GetObject("winmgmts:").ExecQuery("ProcessId = " + str(pid))count olan Win32_Process'ten * seçin.

Diğer filtreleri de kullanabilirsiniz. Örneğin, büyük olasılıkla bir işlemin ada göre çalışıp çalışmadığını söylemek ve harekete geçmek istiyorum. Örneğin, DbgView çalışmıyorsa başlatın.

GetObject("winmgmts:").ExecQuery("Win32_Process'ten * seçin, burada Ad = "dbgview.exe"").count: subprocess.Popen(r"C:\U\dbgview.exe", kabuk=False)

Ayrıca yineleyebilir ve başka harika şeyler yapabilirsiniz. Tam liste alanlar burada.

Son zamanlarda mevcut süreçleri listelemek zorunda kaldım ve bu yüzden:

Tanım check_process(process): import re import subprocess returnprocess = False s = subprocess.Popen(["ps", "ax"],stdout=subprocess.PIPE) s.stdout'ta x için: if re.search(process, x ): returnprocess = True if returnprocess == False: print "işlem yürütülmüyor" eğer returnprocess == True: print "işlem yürütülüyor"

Onu iki kez bulmalısın.

ps-ef | grep 71676 | sed "s/71676//" | grep 71676

True döndürürse, gerçekten işe yarıyor!

WMIC ve TASKLIST araçlarını seviyorum, ancak bunlar Windows'un home/master sürümlerinde mevcut değil. Başka bir yol da, neredeyse tüm Windows makinelerinde bulunan QPROCESS komutunu kullanmaktır (terminal hizmetlerine sahip olanlar için - bence yalnızca SP2 olmadan XP kazanın, yani pratik olarak her Windows bilgisayar):

@echo off:check_process setlocal if "%~1" equ "" echo işlem adını forst argümanı olarak iletin && çıkış /b 1:: ilk argüman, set process_to_check=%~1:: QPROCESS çalışıyorsa kontrol etmek istediğiniz süreçtir çalışan sürecin sadece ilk 12 sembolünü gösterebilir:: Başka bir araç kullanılırsa aşağıdaki satır silinebilir set process_to_check=%process_to_check:~0.12% QPROCESS * | /i "%process_to_check%" >nul 2>'yi bulun

QSÜRECİ Komut, TASKLIST kadar güçlü değildir ve işlem adının yalnızca 12 karakterini görüntülemekle sınırlıdır, ancak TASKLIST mevcut değilse dikkate alınmalıdır.

Daha kolay bir kullanım, if işlem adını argüman olarak kullandığı zamandır (bu durumda yürütülebilir dosya adını ilettiğinizde .exe soneki zorunludur):

@echo off:check_process setlocal if "%~1" equ "" echo işlem adını forst argümanı olarak iletin && çıkış /b 1:: ilk argüman kontrol etmek istediğiniz işlemdir:: .exe soneki çalışıyorsa zorunlu set " process_to_check=%~1" QPROCESS "%process_to_check%" >nul 2>&1 && (yankı işlemi %process_to_check% çalışıyor) || (yankı işlemi %process_to_check% çalışmıyor) endlocal

QPROCESS'i kullanmanın iki yolu arasındaki fark, QPROCESS *'in tüm işlemleri listelemesi, QPROCESS some.exe'nin ise yalnızca mevcut kullanıcı için işlemleri filtrelemesidir.

WMI nesnelerini WMIC yerine windows script host exe aracılığıyla kullanmak da bir seçenektir. Ayrıca tüm Windows makinelerinde çalışmalıdır (WSH devre dışı olanlar hariç, ancak bu nadirdir). İşte WMI sınıfları aracılığıyla tüm işlemleri listeleyen ve yukarıdaki betikte QPROCESS yerine kullanılabilen bir yarasa dosyası (bu bir jscript/bat melezidir ve .bat olarak kaydedilmelidir):

@if (@X)==(@Y) @end /* JSCRIPT YORUM ** @echo off cscript //E:JScript //nologo "%~f0" çıkış /b ********** **** JSCRIPT YORUMUNUN sonu **/ var winmgmts = GetObject("winmgmts:\\\\.\\root\\cimv2"); var colProcess = winmgmts.ExecQuery("Win32_Process'ten * seçeneğini seçin"); var süreçler = new Enumerator(colProcess); for (;!processes.atEnd();processes.moveNext()) ( var process=processes.item(); WScript.Echo(process.processID + " " + process.Name); )

Ve işlemin çalışıp çalışmadığını kontrol edecek bir değişiklik:

@if (@X)==(@Y) @end /* JSCRIPT YORUM ** @echo off if "%~1" equ "" echo işlem adını forst argümanı olarak iletin && çıkış /b 1:: ilk argüman set process_to_check=%~1 cscript //E:JScript //nologo "%~f0" | find /i "%process_to_check%" >nul 2>&1 && (yankı işlemi %process_to_check% çalışıyor) || (eko işlemi %process_to_check% çalışmıyor) /b ************** JSCRIPT COMMENT sonu **/ var winmgmts = GetObject("winmgmts:\\\\.\\root \\cimv2"); var colProcess = winmgmts.ExecQuery("Win32_Process'ten * seçeneğini seçin"); var süreçler = new Enumerator(colProcess); for (;!processes.atEnd();processes.moveNext()) ( var process=processes.item(); WScript.Echo(process.processID + " " + process.Name); )

Bu iki seçenek, TASKLIST olmayan makinelerde kullanılabilir.

Son teknik MSHTA'yı kullanır. Bu, XP ve üzeri tüm Windows makinelerinde çalışır ve Windows'tan bağımsızdır. Windows ayarları senaryo. MSHTA'yı çağırmak performansı biraz düşürebilir (yine yarasa olarak kaydetmeniz gerekir):

@if (@X)==(@Y) @end /* JSCRIPT YORUM ** @echo off setlocal if "%~1" equ "" echo işlem adını forst argümanı olarak iletin && çıkış /b 1:: ilk argüman set process_to_check=%~1 mshta "about: çalıştırılıp çalıştırılmadığını kontrol etmek istediğiniz işlemdir:" | find /i "%process_to_check%" >nul 2>&1 && (yankı işlemi %process_to_check% çalışıyor) || (yankı işlemi %process_to_check% çalışmıyor) yerel çıkış /b ********* ***** JSCRIPT YORUMUNUN sonu **/ var fso= new ActiveXObject("Scripting.FileSystemObject").GetStandardStream(1); var winmgmts = GetObject("winmgmts:\\\\.\\root\\cimv2" ); var colProcess = winmgmts.ExecQuery("Win32_Process'ten * seçin"); var process'ler = new Enumerator(colProcess); for (;!processes.atEnd();processes.moveNext()) ( var process=processes.item( ); fso.Write(process.processID + " " + process.Name + "\n"); ) kapat();