THE BELL

Є ті, хто прочитали цю новину раніше вас.
Підпишіться, щоб отримувати статті свіжими.
Email
ім'я
Прізвище
Як ви хочете читати The Bell
без спаму

Мені подобається WMIC і TASKLIST інструментів, але вони не доступні в будинку / основні видання windows.Another способу є використання QPROCESS команд доступні на майже кожне вікно машини (для тих, які мають термінальні послуги - Я думаю, що тільки перемога XP без SP2, так practialy кожен вікна машини):

@echo off: check_process setlocal if "% ~ 1" equ "" echo pass the process name as forst argument && exit / b 1 :: first argument is the process you want to check if running set process_to_check \u003d% ~ 1 :: QPROCESS can display only the first 12 symbols of the running process :: If other tool is used the line bellow could be deleted set process_to_check \u003d% process_to_check: ~ 0,12% QPROCESS * | find / i "% process_to_check%"\u003e nul 2\u003e

QPROCESS команда не настільки сильна, як TASKLIST і обмежується в показі тільки 12 символів імені процесу, але слід брати до уваги, якщо TASKLIST не доступний.

Більш просте використання, де він використовує ім'я, якщо процес як аргумент (суффікс.exe є обов'язковим в цьому випадку, коли ви передаєте ім'я виконуваного файлу):

@echo off: check_process setlocal if "% ~ 1" equ "" echo pass the process name as forst argument && exit / b 1 :: first argument is the process you want to check if running :: .exe suffix is \u200b\u200bmandatory set " process_to_check \u003d% ~ 1 "QPROCESS"% process_to_check% "\u003e nul 2\u003e & 1 && (echo process% process_to_check% is running) || (Echo process% process_to_check% is not running) endlocal

Різниця між двома способами QPROCESS використання що QPROCESS * перераховує всі процеси, в той час як QPROCESS some.exe буде фільтрувати тільки процеси для поточного користувача.

Використання WMI об'єктів через windows script host exe замість WMIC також є опцією. Він також повинен запускатися на всіх машинах Windows (Виключаючи ті, де WSH вимкнений, але це рідкісний випадок) .Тут кажан файл, в якому перераховані всі процеси через класи WMI і може бути використаний замість QPROCESS в сценарії вище (це JScript / кажан гібрид і повинні бути збережені как.bat ):

@if (@X) \u003d\u003d (@ Y) @end / * JSCRIPT COMMENT ** @echo off cscript // E: JScript // nologo "% ~ f0" exit / b ********** **** end of JSCRIPT COMMENT ** / var winmgmts \u003d GetObject ( "winmgmts: \\\\\\\\. \\\\ root \\\\ cimv2"); var colProcess \u003d winmgmts.ExecQuery ( "Select * from Win32_Process"); var processes \u003d new Enumerator (colProcess); for (;! processes.atEnd (); processes.moveNext ()) (var process \u003d processes.item (); WScript.Echo (process.processID + "" + process.Name);)

І модифікація, яка буде перевіряти якщо процес запущений:

@if (@X) \u003d\u003d (@ Y) @end / * JSCRIPT COMMENT ** @echo off if "% ~ 1" equ "" echo pass the process name as forst argument && exit / b 1 :: first argument is the process you want to check if running set process_to_check \u003d% ~ 1 cscript // E: JScript // nologo "% ~ f0" | find / i "% process_to_check%"\u003e nul 2\u003e & 1 && (echo process% process_to_check% is running) || (Echo process% process_to_check% is not running) exit / b ************** end of JSCRIPT COMMENT ** / var winmgmts \u003d GetObject ( "winmgmts: \\\\\\\\. \\\\ root \\\\ cimv2 "); var colProcess \u003d winmgmts.ExecQuery ( "Select * from Win32_Process"); var processes \u003d new Enumerator (colProcess); for (;! processes.atEnd (); processes.moveNext ()) (var process \u003d processes.item (); WScript.Echo (process.processID + "" + process.Name);)

два варіанти може бути використаний на машинах, які не мають TASKLIST.

Кінцева техніка використовується MSHTA. Це буде працювати на всіх машинах Windows з XP і вище і не залежить від налаштувань хоста Windows Script. виклик MSHTA може скоротити трохи на продуктивність, хоча (знову-таки повинна бути збережена в кажана):

@if (@X) \u003d\u003d (@ Y) @end / * JSCRIPT COMMENT ** @echo off setlocal if "% ~ 1" equ "" echo pass the process name as forst argument && exit / b 1 :: first argument is the process you want to check if running set process_to_check \u003d% ~ 1 mshta "about:"| Find / i"% process_to_check% "\u003e nul 2\u003e & 1 && (echo process% process_to_check% is running) || (echo process% process_to_check% is not running) endlocal exit / b ********* ***** end of JSCRIPT COMMENT ** / var fso \u003d new ActiveXObject ( "Scripting.FileSystemObject"). GetStandardStream (1); var winmgmts \u003d GetObject ( "winmgmts: \\\\\\\\. \\\\ root \\\\ cimv2" ); var colProcess \u003d winmgmts.ExecQuery ( "Select * from Win32_Process"); var processes \u003d new Enumerator (colProcess); for (;! processes.atEnd (); processes.moveNext ()) (var process \u003d processes.item ( ); fso.Write (process.processID + "" + process.Name + "\\ n");) close ();

Я намагаюся знайти, чи працює процес на основі ідентифікатора процесу. Код виглядає наступним чином, грунтуючись на одному з повідомлень на форумі. Я не можу розглядати ім'я процесу, оскільки існує кілька процесів, що працюють під тим же ім'ям.

Def findProcess (processId): ps \u003d subprocess.Popen ( "ps -ef | grep" + processId, shell \u003d True, stdout \u003d subprocess.PIPE) output \u003d ps.stdout.read () ps.stdout.close () ps. wait () return output def isProcessRunning (processId): output \u003d findProcess (processId) if re.search (processId, output) is None: return true else: return False 1111 72312 72311 0 0: 00.00 ttys000 0: 00.00 / bin / sh -c ps -ef | grep 71676 1111 72314 72312 0 0: 00.00 ttys000 0: 00.00 grep 71676

Він завжди повертає true, оскільки він може знайти ідентифікатор процесу у вихідний рядку.

Будь-які пропозиції? Спасибі за будь-яку допомогу.

11 Solutions collect form web for "Перевірте, чи запущений процес в Python (в Linux / Unix)"

намагатися:

Os.kill (pid, 0)

Повинен досягти успіху (і нічого не робити), якщо процес існує, або викинути виняток (яке ви можете зловити), якщо процес не існує.

Найпростіша відповідь, на мій погляд (albiet, можливо, не ідеальний), - це змінити

Ps -ef | grep

Для того щоб:

Ps -ef | grep | grep -v grep

Це буде ігнорувати список процесів для пошуку grep, що містить PID процесу, який ви намагаєтеся знайти.

Мабуть, відповідь пользователя9876 набагато більш «пітоніческій».

Це трохи kludge, але на * nix ви можете використовувати os.getpgid (pid) або os.kill (pid, sig), щоб перевірити наявність ідентифікатора процесу.

Import os def is_process_running (process_id): try: os.kill (process_id, 0) return True except OSError: return False

EDIT: Зверніть увагу, що os.kill працює в Windows (з Python 2.7), а os.getpgid не буде . але версія Windows викликає TerminateProcess (), яка «беззастережно змусить процес вийти», тому я передбачаю, що він не буде безпечно повертати потрібну вам інформацію, фактично не вбивши процес, якщо він існує.

Якщо ви використовуєте Windows, повідомте нам про це, тому що жодне з цих рішень не прийнятно в цьому сценарії.

Ви можете перевірити, чи існує папка / proc /.

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

Див. Так: Як ви перевіряєте Linux з Python, якщо процес все ще запущений?

Якщо ви не заперечуєте проти використання зовнішнього модуля, я б запропонував psutil. Це крос-платформний і простий у використанні, ніж нерестовий подоболочка тільки з метою пошуку пов'язаних з поточною діяльністю.

Якщо цей процес належить одному і тому ж користувачеві, процес перевірки, ви можете просто спробувати його kill. Якщо ви використовуєте сигнал 0, kill не відправить нічого, але все ж дозволить вам дізнатися, чи доступний цей процес.

Якщо sig дорівнює 0, то сигнал не надсилається, але перевірка помилок все ще виконується; це можна використовувати для перевірки наявності ідентифікатора процесу або ідентифікатора групи процесів.

Це повинно відповідним чином поширюватися на методи python.

Я знаю, що це старо, але я використав це і, схоже, працює; ви можете швидко адаптуватися до перетворення з імені процесу в ідентифікатор процесу:

Try: if len (os.popen ( "ps -aef | grep -i" myprocess "| grep -v" grep "| awk" (print $ 3) ""). Read (). Strip (). Split ( "\\ У Windows інший варіант - використовувати tasklist.exe:

Синтаксис: tasklist.exe / NH / FI "PID eq processID"

Def IsProcessRunning (processId): ps \u003d subprocess.Popen (r "tasklist.exe / NH / FI" PID eq% d ""% (processId), shell \u003d True, stdout \u003d subprocess.PIPE) output \u003d ps.stdout.read () ps.stdout.close () ps.wait () if processId in output: return True return False

У Windows ви можете використовувати WMI.

From win32com.client import GetObject GetObject ( "winmgmts:"). ExecQuery ( "Select * from Win32_Process where ProcessId \u003d" + str (pid)). Count

Ви також можете використовувати інші фільтри. Наприклад, я, швидше за все, просто хочу сказати, чи працює процес по імені і робить дії. Наприклад, якщо DbgView не запущено, запустіть його.

If not GetObject ( "winmgmts:"). ExecQuery ( "Select * from Win32_Process where Name \u003d" dbgview.exe ""). Count: subprocess.Popen (r "C: \\ U \\ dbgview.exe", shell \u003d False)

Ви також можете перебирати і робити інші цікаві речі.

Повний список полів знаходиться тут. Нещодавно мені довелося перерахувати поточні процеси і так:

Def check_process (process): import re import subprocess returnprocess \u003d False s \u003d subprocess.Popen ([ "ps", "ax"], stdout \u003d subprocess.PIPE) for x in s.stdout: if re.search (process, x ): returnprocess \u003d True if returnprocess \u003d\u003d False: print "no process executing" if returnprocess \u003d\u003d True: print "process executing"

Ви повинні знайти його двічі.

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

Якщо це повертає True то це дійсно працює!

Мені подобаються інструменти WMIC і TASKLIST, але вони недоступні в домашніх / основних версіях вікон. Іншим способом є використання команди QPROCESS, доступною майже на всіх машинах Windows (для тих, які мають термінальні служби - Я думаю, що тільки виграти XP без SP2, так що практично кожен комп'ютер Windows):

@echo off: check_process setlocal if "% ~ 1" equ "" echo pass the process name as forst argument && exit / b 1 :: first argument is the process you want to check if running set process_to_check \u003d% ~ 1 :: QPROCESS can display only the first 12 symbols of the running process :: If other tool is used the line bellow could be deleted set process_to_check \u003d% process_to_check: ~ 0,12% QPROCESS * | find / i "% process_to_check%"\u003e nul 2\u003e

QPROCESS команда не така сильна, як TASKLIST і обмежена відображенням всього 12 символів ім'я процесу, але слід враховувати, якщо TASKLIST недоступно.

Більш просте використання, коли воно використовує ім'я, якщо процес як аргумент (суффікс.exe є обов'язковим в цьому випадку, коли ви передаєте виконується ім'я):

@echo off: check_process setlocal if "% ~ 1" equ "" echo pass the process name as forst argument && exit / b 1 :: first argument is the process you want to check if running :: .exe suffix is \u200b\u200bmandatory set " process_to_check \u003d% ~ 1 "QPROCESS"% process_to_check% "\u003e nul 2\u003e & 1 && (echo process% process_to_check% is running) || (Echo process% process_to_check% is not running) endlocal

Різниця між двома способами використання QPROCESS полягає в тому, що QPROCESS * відобразить всі процеси, а QPROCESS some.exe буде фільтрувати тільки процеси для поточного користувача.

Використання WMI об'єктів через вікна script host exe замість WMIC також є опцією. Він повинен також запускатися на всіх машинах Windows (виключаючи ті, де WSH вимкнений, але це рідкісний випадок). Ось файл bat, який перераховує всі процеси через класи WMI і може використовуватися замість QPROCESS в script вище (це гібрид jscript / bat і повинен бути збережений как.bat):

@if (@X) \u003d\u003d (@ Y) @end / * JSCRIPT COMMENT ** @echo off cscript // E: JScript // nologo "% ~ f0" exit / b ********** **** end of JSCRIPT COMMENT ** / var winmgmts \u003d GetObject ( "winmgmts: \\\\\\\\. \\\\ root \\\\ cimv2"); var colProcess \u003d winmgmts.ExecQuery ( "Select * from Win32_Process"); var processes \u003d new Enumerator (colProcess); for (;! processes.atEnd (); processes.moveNext ()) (var process \u003d processes.item (); WScript.Echo (process.processID + "" + process.Name);)

І модифікація, яка буде перевіряти, чи запущений процес:

@if (@X) \u003d\u003d (@ Y) @end / * JSCRIPT COMMENT ** @echo off if "% ~ 1" equ "" echo pass the process name as forst argument && exit / b 1 :: first argument is the process you want to check if running set process_to_check \u003d% ~ 1 cscript // E: JScript // nologo "% ~ f0" | find / i "% process_to_check%"\u003e nul 2\u003e & 1 && (echo process% process_to_check% is running) || (Echo process% process_to_check% is not running) exit / b ************** end of JSCRIPT COMMENT ** / var winmgmts \u003d GetObject ( "winmgmts: \\\\\\\\. \\\\ root \\\\ cimv2 "); var colProcess \u003d winmgmts.ExecQuery ( "Select * from Win32_Process"); var processes \u003d new Enumerator (colProcess); for (;! processes.atEnd (); processes.moveNext ()) (var process \u003d processes.item (); WScript.Echo (process.processID + "" + process.Name);)

Ці два параметри можна використовувати на машинах без TASKLIST.

Кінцева техніка використовує MSHTA. Це буде працювати на всіх машинах Windows з XP і вище і не залежить від налаштувань Windows script. виклик MSHTA може трохи знизити продуктивність (знову ж потрібно зберегти як bat):

@if (@X) \u003d\u003d (@ Y) @end / * JSCRIPT COMMENT ** @echo off setlocal if "% ~ 1" equ "" echo pass the process name as forst argument && exit / b 1 :: first argument is the process you want to check if running set process_to_check \u003d% ~ 1 mshta "about:"| Find / i"% process_to_check% "\u003e nul 2\u003e & 1 && (echo process% process_to_check% is running) || (echo process% process_to_check% is not running) endlocal exit / b ********* ***** end of JSCRIPT COMMENT ** / var fso \u003d new ActiveXObject ( "Scripting.FileSystemObject"). GetStandardStream (1); var winmgmts \u003d GetObject ( "winmgmts: \\\\\\\\. \\\\ root \\\\ cimv2" ); var colProcess \u003d winmgmts.ExecQuery ( "Select * from Win32_Process"); var processes \u003d new Enumerator (colProcess); for (;! processes.atEnd (); processes.moveNext ()) (var process \u003d processes.item ( ); fso.Write (process.processID + "" + process.Name + "\\ n");) close ();

THE BELL

Є ті, хто прочитали цю новину раніше вас.
Підпишіться, щоб отримувати статті свіжими.
Email
ім'я
Прізвище
Як ви хочете читати The Bell
без спаму