زنگ

کسانی هستند که قبل از شما این خبر را می خوانند.
برای دریافت آخرین مقالات مشترک شوید.
پست الکترونیک
نام
نام خانوادگی
چگونه دوست دارید زنگ را بخوانید
بدون هرزنامه

من ابزارهای WMIC و TASKLIST را دوست دارم، اما آنها در نسخه‌های خانگی/اصلی ویندوز در دسترس نیستند. راه دیگر استفاده از دستورات QPROCESS است که تقریباً در هر ماشین پنجره‌ای موجود است (برای کسانی که سرویس‌های ترمینال دارند - فکر می‌کنم فقط XP بدون SP2 برنده شود. ، بنابراین عملاً هر دستگاه پنجره):

@echo off:check_process setlocal if "%~1" equ "" echo نام فرآیند را به‌عنوان آرگومان forst && exit /b 1:: اولین آرگومان فرآیندی است که می‌خواهید بررسی کنید که آیا set process_to_check=%~1:: QPROCESS در حال اجرا است می تواند فقط 12 نماد اول فرآیند در حال اجرا را نمایش دهد:: اگر از ابزار دیگری استفاده شود، خط زیر می تواند حذف شود set process_to_check=%process_to_check:~0.12% QPROCESS * | /i "%process_to_check%" >nul 2> را پیدا کنید

QPROCESSاین فرمان به اندازه TASKLIST قدرتمند نیست و فقط به نمایش 12 کاراکتر از نام فرآیند محدود می شود، اما اگر TASKLIST در دسترس نباشد باید در نظر گرفته شود.

یک استفاده ساده تر که در آن از name if به عنوان آرگومان استفاده می کند (پسوند exe در این مورد زمانی که نام را ارسال می کنید مورد نیاز است. فایل اجرایی):

@echo off:check_process setlocal if "%~1" equ "" echo نام فرآیند را به‌عنوان آرگومان forst و& exit /b 1:: اولین آرگومان فرآیندی است که می‌خواهید بررسی کنید که آیا اجرای پسوند:: .exe اجباری است تنظیم "process_to_check=%~1" QPROCESS "%process_to_check%" >nul 2>&1 && (فرآیند echo %process_to_check% در حال اجرا است) || (فرآیند اکو %process_to_check% در حال اجرا نیست) endlocal

تفاوت بین دو روش استفاده از QPROCESS در این است که QPROCESS * تمام فرآیندها را لیست می کند در حالی که QPROCESS some.exe فقط فرآیندهای مربوط به آن را فیلتر می کند. کاربر فعلی.

استفاده از اشیاء WMI از طریق exe میزبان اسکریپت ویندوز به جای WMIC نیز یک گزینه است. همچنین باید روی همه اجرا شود ماشین های ویندوز(به استثنای مواردی که WSH غیرفعال است، اما این یک مورد نادر است). در اینجا یک فایل bat وجود دارد که تمام فرآیندها را از طریق کلاس های WMI فهرست می کند و می تواند به جای QPROCESS در اسکریپت بالا استفاده شود (این یک ترکیب JScript/BAT است و باید باشد. ذخیره شده به عنوان .bat):

@if (@X)==(@Y) @end /* JSCRIPT COMMENT ** @echo off cscript //E:JScript //nologo "%~f0" خروج /b ********** **** انتهای JSCRIPT COMMENT **/ var winmgmts = GetObject("winmgmts:\\\\.\\root\\cimv2"); var colProcess = winmgmts.ExecQuery("Select * from Win32_Process"); var processes = new Enumerator(colProcess); برای (;!processes.atEnd();processes.moveNext()) ( var process=processes.item(); WScript.Echo(process.processID + " " + process.Name); )

و یک اصلاح که بررسی می کند که آیا فرآیند در حال اجرا است:

@if (@X)==(@Y) @end /* JSCRIPT COMMENT ** @echo غیرفعال است اگر "%~1" معادله "" echo نام فرآیند را به عنوان آرگومان forst ارسال می کند و& خروج /b 1:: اولین آرگومان است فرآیندی که می‌خواهید بررسی کنید که آیا در حال اجراست process_to_check=%~1 cscript //E:JScript //nologo "%~f0" | پیدا کردن /i "%process_to_check%" >nul 2>&1 && (فرآیند echo %process_to_check% در حال اجرا است) || (فرآیند پژواک %process_to_check% در حال اجرا نیست) از /b خارج شوید ************** انتهای JSCRIPT COMMENT **/ var winmgmts = GetObject("winmgmts:\\\\.\\root \\cimv2")؛ var colProcess = winmgmts.ExecQuery("Select * from Win32_Process"); var processes = new Enumerator(colProcess); برای (;!processes.atEnd();processes.moveNext()) ( var process=processes.item(); WScript.Echo(process.processID + " " + process.Name); )

دو گزینه را می توان در ماشین هایی که TASKLIST ندارند استفاده کرد.

تکنیک نهایی توسط MSHTA استفاده می شود. این روی تمام دستگاه های ویندوز از XP و بالاتر کار می کند و مستقل از تنظیمات است هاست ویندوزاسکریپت. تماس MSHTA ممکن است کمی عملکرد را کاهش دهد (دوباره باید در bat ذخیره شود):

@if (@X)==(@Y) @end /* JSCRIPT COMMENT ** @echo off setlocal if "%~1" equ "" echo نام فرآیند را به‌عنوان آرگومان forst منتقل می‌کند و && exit /b 1:: اولین آرگومان فرآیندی است که می‌خواهید بررسی کنید که آیا در حال اجرای set process_to_check=%~1 mshta "درباره:" | find /i "%process_to_check%" >nul 2>&1 && (فرآیند پژواک %process_to_check% در حال اجرا است) || (پژواک فرآیند %process_to_check% در حال اجرا نیست) خروجی endlocal /b ********* ***** انتهای JSCRIPT COMMENT **/ var fso= new ActiveXObject("Scripting.FileSystemObject").GetStandardStream(1)؛ var winmgmts = GetObject("winmgmts:\\\\.\\root\\cimv2" var colProcess = winmgmts.ExecQuery ("انتخاب * از Win32_Process")؛ var processes = Enumerator (colProcess) جدید؛ برای (;!processes.atEnd();processes.moveNext()) ( var process=processes.item( fso.Write(process.processID + " " + process.Name + "\n"); ) close();

من سعی می کنم پیدا کنم که آیا یک فرآیند بر اساس شناسه فرآیند در حال اجرا است یا خیر. این کد بر اساس یکی از پست های انجمن به نظر می رسد. من نمی توانم نام فرآیند را ببینم زیرا چندین پردازش تحت یک نام در حال اجرا هستند.

Def findProcess(processId): ps= subprocess.Popen("ps -ef | grep "+processId, shell=True, stdout=subprocess.PIPE) خروجی = ps.stdout.read() ps.stdout.close() ps. Wait() خروجی را برگرداند def isProcessRunning(processId): output = findProcess(processId) اگر re.search(processId, output) None باشد: return true else: return False 1111 72312 72311 0 0:00.00 ttys000 0:000 0:00. -c ps -ef | grep 71676 1111 72314 72312 0 0:00.00 ttys000 0:00.00 grep 71676

همیشه true برمی گرداند زیرا می تواند شناسه فرآیند را در رشته خروجی پیدا کند.

پیشنهادی دارید؟ بابت هرگونه کمک سپاسگذارم.

11 راه حل وب فرم را برای "بررسی اینکه آیا یک فرآیند در پایتون در حال اجرا است (در لینوکس/یونیکس)" جمع آوری می کند.

تلاش كردن:

os.kill(pid, 0)

اگر فرآیند وجود داشته باشد، باید موفق شود (و هیچ کاری انجام ندهد)، یا اگر فرآیند وجود نداشته باشد، یک استثنا (که می توانید آن را بگیرید) پرتاب کنید.

به نظر من ساده ترین پاسخ (البیه شاید ایده آل نباشد) تغییر است

Ps -ef | grep

به منظور. واسه اینکه. برای اینکه:

Ps -ef | grep | grep -v grep

با این کار لیست جستجوی grep از فرآیندهای حاوی PID فرآیندی که می‌خواهید پیدا کنید نادیده گرفته می‌شود.

ظاهراً پاسخ user9876 بسیار بیشتر «پایتونیک» است.

این کمی مبهم است، اما در *nix می‌توانید از os.getpgid(pid) یا os.kill(pid, sig) برای بررسی وجود شناسه فرآیند استفاده کنید.

Import os def is_process_running(process_id): try: os.kill(process_id, 0) return True به جز OSError: return False

ویرایش: لطفاً توجه داشته باشید که os.kill روی ویندوز (از پایتون 2.7) کار می کند در حالی که os.getpgid نخواهد . ولی نسخه ویندوز TerminateProcess() را فراخوانی می‌کند که «بی‌قید و شرط فرآیند را مجبور به خروج می‌کند»، بنابراین من پیش‌بینی می‌کنم که در صورت وجود، بدون از بین بردن فرآیند، اطلاعات مورد نیاز شما را با خیال راحت برگرداند.

اگر از ویندوز استفاده می کنید، لطفاً به ما اطلاع دهید زیرا هیچ یک از این راه حل ها در این سناریو قابل قبول نیستند.

می توانید بررسی کنید که پوشه /proc/ وجود دارد یا خیر.

>>> import os.path >>> os.path.exists("/proc/0") غلط >>> os.path.exists("/proc/12") درست است

بنابراین ببینید: اگر فرآیندی هنوز در حال اجرا است، چگونه لینوکس را با پایتون بررسی می کنید؟

اگر مشکلی برای استفاده از ماژول خارجی ندارید، من psutil را پیشنهاد می کنم. این کراس پلتفرم است و استفاده از آن آسان تر از ایجاد یک زیر پوسته فقط برای یافتن فرآیند فعلی است.

اگر این فرآیند متعلق به همان کاربر است، فرآیند را بررسی کنید، فقط می توانید سعی کنید آن را بکشید. اگر از سیگنال 0 استفاده می کنید، kill چیزی ارسال نمی کند، اما همچنان به شما اطلاع می دهد که آیا فرآیند در دسترس است.

اگر sig 0 باشد، هیچ سیگنالی ارسال نمی شود، اما بررسی خطا همچنان انجام می شود. این می تواند برای بررسی وجود شناسه فرآیند یا شناسه گروه پردازش استفاده شود.

این باید به روش های پایتون به طور مناسب منتشر شود.

من می دانم که این قدیمی است اما من از آن استفاده کرده ام و به نظر می رسد کار می کند. شما می توانید به سرعت با تبدیل از نام فرآیند به شناسه فرآیند سازگار شوید:

امتحان کنید: if len(os.popen("ps -aef | grep -i "myprocess" | grep -v "grep" | awk "( print $3 )"").read().strip().split("\ n")) > 1: افزایش SystemExit(0) به جز Exception، e: افزایش e

در ویندوز، گزینه دیگر استفاده از tasklist.exe است:

نحو: 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) خروجی = ps.stdout.read () ps.stdout.close() ps.wait() if processId در خروجی: return true return false

در ویندوز می توانید از WMI استفاده کنید.

از win32com.client واردات GetObject GetObject("winmgmts:").ExecQuery("انتخاب * از Win32_Process جایی که ProcessId = " + str(pid)).

همچنین می توانید از فیلترهای دیگر استفاده کنید. به عنوان مثال، من به احتمال زیاد فقط می خواهم بگویم که آیا یک فرآیند با نام اجرا می شود و اقدامی انجام دهم. به عنوان مثال، اگر DbgView در حال اجرا نیست، آن را شروع کنید.

اگر نه GetObject("winmgmts:").ExecQuery("انتخاب * از Win32_Process که در آن Name = "dbgview.exe"").count: subprocess.Popen(r"C:\U\dbgview.exe، shell=False)

همچنین می توانید تکرار کنید و کارهای جالب دیگری انجام دهید. لیست کاملفیلدها اینجاست

اخیراً مجبور شدم فرآیندهای فعلی را لیست کنم و به همین ترتیب:

Def check_process(process): import re import subprocess returnprocess = False s = subprocess.Popen(["ps", "ax"],stdout=subprocess.PIPE) برای x در s.stdout: if re.search(process, x ): returnprocess = درست اگر returnprocess == نادرست: چاپ "no process executing" if returnprocess == True: print "process executing"

باید دوبار پیداش کنی

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

اگر True را برگرداند، واقعاً کار می کند!

من ابزارهای WMIC و TASKLIST را دوست دارم، اما آنها در نسخه های خانگی/مستر ویندوز موجود نیستند. راه دیگر استفاده از دستور QPROCESS است که تقریباً در تمام ماشین‌های ویندوز موجود است (برای آنهایی که خدمات ترمینال دارند - فکر می‌کنم فقط XP بدون SP2 برنده می‌شود، بنابراین عملاً هر کامپیوتر ویندوز):

@echo off:check_process setlocal if "%~1" equ "" echo نام فرآیند را به‌عنوان آرگومان forst && exit /b 1:: اولین آرگومان فرآیندی است که می‌خواهید بررسی کنید که آیا set process_to_check=%~1:: QPROCESS در حال اجرا است می تواند فقط 12 نماد اول فرآیند در حال اجرا را نمایش دهد:: اگر از ابزار دیگری استفاده شود، خط زیر می تواند حذف شود set process_to_check=%process_to_check:~0.12% QPROCESS * | /i "%process_to_check%" >nul 2> را پیدا کنید

QPROCESSاین دستور به اندازه TASKLIST قدرتمند نیست و فقط به نمایش 12 کاراکتر از نام فرآیند محدود می شود، اما اگر TASKLIST در دسترس نباشد باید در نظر گرفته شود.

استفاده آسان تر زمانی است که از نام فرآیند if به عنوان آرگومان استفاده می کند (پسوند exe در این مورد اجباری است که نام اجرایی را ارسال می کنید):

@echo off:check_process setlocal if "%~1" equ "" echo نام فرآیند را به‌عنوان آرگومان forst و& exit /b 1:: اولین آرگومان فرآیندی است که می‌خواهید بررسی کنید که آیا اجرای پسوند:: .exe اجباری است تنظیم "process_to_check=%~1" QPROCESS "%process_to_check%" >nul 2>&1 && (فرآیند echo %process_to_check% در حال اجرا است) || (فرآیند اکو %process_to_check% در حال اجرا نیست) endlocal

تفاوت بین دو روش استفاده از QPROCESS این است که QPROCESS * تمام فرآیندها را فهرست می کند، در حالی که QPROCESS some.exe فقط فرآیندها را برای کاربر فعلی فیلتر می کند.

استفاده از اشیاء WMI از طریق exe میزبان اسکریپت ویندوز به جای WMIC نیز یک گزینه است. همچنین باید روی همه ماشین‌های ویندوز اجرا شود (به استثنای دستگاه‌هایی که WSH غیرفعال هستند، اما این نادر است). در اینجا یک فایل bat است که تمام فرآیندها را از طریق کلاس های WMI فهرست می کند و می تواند به جای QPROCESS در اسکریپت بالا استفاده شود (این یک ترکیب jscript/bat است و باید به عنوان bat. ذخیره شود):

@if (@X)==(@Y) @end /* JSCRIPT COMMENT ** @echo off cscript //E:JScript //nologo "%~f0" خروج /b ********** **** انتهای JSCRIPT COMMENT **/ var winmgmts = GetObject("winmgmts:\\\\.\\root\\cimv2"); var colProcess = winmgmts.ExecQuery("Select * from Win32_Process"); var processes = new Enumerator(colProcess); برای (;!processes.atEnd();processes.moveNext()) ( var process=processes.item(); WScript.Echo(process.processID + " " + process.Name); )

و یک اصلاح که بررسی می کند که آیا فرآیند در حال اجرا است:

@if (@X)==(@Y) @end /* JSCRIPT COMMENT ** @echo غیرفعال است اگر "%~1" معادله "" echo نام فرآیند را به عنوان آرگومان forst ارسال می کند و& خروج /b 1:: اولین آرگومان است فرآیندی که می‌خواهید بررسی کنید که آیا در حال اجراست process_to_check=%~1 cscript //E:JScript //nologo "%~f0" | پیدا کردن /i "%process_to_check%" >nul 2>&1 && (فرآیند echo %process_to_check% در حال اجرا است) || (فرآیند پژواک %process_to_check% در حال اجرا نیست) از /b خارج شوید ************** انتهای JSCRIPT COMMENT **/ var winmgmts = GetObject("winmgmts:\\\\.\\root \\cimv2")؛ var colProcess = winmgmts.ExecQuery("Select * from Win32_Process"); var processes = new Enumerator(colProcess); برای (;!processes.atEnd();processes.moveNext()) ( var process=processes.item(); WScript.Echo(process.processID + " " + process.Name); )

این دو گزینه را می توان در ماشین های بدون TASKLIST استفاده کرد.

تکنیک نهایی از MSHTA استفاده می کند. این روی همه دستگاه‌های ویندوز از XP و بالاتر کار می‌کند و مستقل از آن است تنظیمات ویندوزاسکریپت فراخوانی MSHTA ممکن است کمی عملکرد را کاهش دهد (باز هم باید به عنوان خفاش ذخیره کنید):

@if (@X)==(@Y) @end /* JSCRIPT COMMENT ** @echo off setlocal if "%~1" equ "" echo نام فرآیند را به‌عنوان آرگومان forst منتقل می‌کند و && exit /b 1:: اولین آرگومان فرآیندی است که می‌خواهید بررسی کنید که آیا در حال اجرای set process_to_check=%~1 mshta "درباره:" | find /i "%process_to_check%" >nul 2>&1 && (فرآیند پژواک %process_to_check% در حال اجرا است) || (پژواک فرآیند %process_to_check% در حال اجرا نیست) خروجی endlocal /b ********* ***** انتهای JSCRIPT COMMENT **/ var fso= new ActiveXObject("Scripting.FileSystemObject").GetStandardStream(1)؛ var winmgmts = GetObject("winmgmts:\\\\.\\root\\cimv2" var colProcess = winmgmts.ExecQuery ("انتخاب * از Win32_Process")؛ var processes = Enumerator (colProcess) جدید؛ برای (;!processes.atEnd();processes.moveNext()) ( var process=processes.item( fso.Write(process.processID + " " + process.Name + "\n"); ) close();

زنگ

کسانی هستند که قبل از شما این خبر را می خوانند.
برای دریافت آخرین مقالات مشترک شوید.
پست الکترونیک
نام
نام خانوادگی
چگونه دوست دارید زنگ را بخوانید
بدون هرزنامه