Работа с процессами



FOR-PROCS: "proc_pattern" <...> ;FOR-PROCS

Специальный цикл, который позволяет обрабатывать не только отдельные процессы, но и целые группы процессов, подпавших под указанную маску: для каждого подходящего процесса будут выполнены команды, заданные в теле цикла FOR-PROCS:.

Работает это так: если, например, под определенную маску подпали пять процессов, то цикл FOR-PROCS: автоматически будет запущен пять раз, причем при каждом запуске будет обновлено значение переменных %FOUND-PROC% и %FOUND-PID%, которые содержат имя найденного процесса и его Process ID (PID) соответственно.

Пример:

#( test_for_processes
\ выводим на консоль имена всех запущенных процессов
NoActive
Action:
    FOR-PROCS: "*.exe"
        FOUND-PROC TYPE CR
    ;FOR-PROCS
)#

Значит, при каждом цикле вы получаете доступ к PID и имени очередного процесса, подпадающего под указанную маску. Вам остается только выполнить над этим процессом нужное действие (прервать, присвоить нужный приоритет и т. д.) или же предпринять новую проверку, чтобы решить, как именно поступить с данным процессом.

Пример:

#( test_for_processes1
\ выводим запрос и прерываем по очереди
\ все найденные процессы "ИЭксплорера"
NoActive
Action:
    FOR-PROCS: "iexplore.exe"
        QUERY: "Прервать процесс %FOUND-PROC%?"
        IF
            KILL: "%FOUND-PID%"
        THEN
    ;FOR-PROCS
)#

KILL: "proc_pattern"

Прерывает работу указанного процесса. Принимает в качестве аргумента маску имени процесса (обычно это имя исполняемого файла, который запускает нужный нам процесс) или строку с числовым идентификатором процесса (Process ID), который помещается во предопределенную переменную PROC-ID сразу после запуска программы.

Использование Process ID позволяет прервать работу конкретного процесса даже в случае, когда запущено несколько копий одной программы, т. е. несколько процессов носят одно имя. Обратите внимание, что переменная PROC-ID заполняется после каждого успешного запуска программы с помощью START-APP, START-APPW или QSTART-APP, но использовать PROC-ID совместно с START-APPW не имеет смысла, т. к. в этом случае переменная хранит идентификатор процесса, который уже завершил работу.

Совместно с KILL: можно также использовать предопределенную переменную %WATCH-PROC-ID%, которая заполняется после применения слов WatchProc:/WatchProcStop: и содержит строку с идентификатором "отловленного" процесса (PID).

Примеры:

\ работаем с именем процесса
KILL: "opera.exe"
KILL: "notepad.exe"
KILL: "*pad.exe"
\ работаем с Process ID
KILL: "2121"
KILL: "%PROC-ID%"
   
#( test_proc_id
NoActive
VARIABLE my_notepad_id
Action:
    START-APP: notepad.exe
    PAUSE: 1000
    START-APP: notepad.exe
    PROC-ID my_notepad_id !
    PAUSE: 1000
    START-APP: notepad.exe
    \ ... smth useful here
    \ прерываем работу Ноутпада, стартовавшего вторым
    KILL: "%my_notepad_id @%"
)#

Существует также постфиксный вариант этого слова:

S" opera.exe" KILL
S" 2121" KILL

kill ( pid -- )

Постфиксное слово, которое прерывает процесс по его PID. kill принимает число в качестве аргумента, поэтому вам не придется конвертировать число, которое возвращает PROC-ID или WATCH-PROC-ID в строку:

386 kill
PROC-ID kill
my_proc_id @ kill

PROC-TIME: "proc_pattern"

Кладет на стек время работы указанного процесса в секундах.

Работает только WinNT/2000/XP.


ProcActiveTime ( pid -- ms)

Кладет на стек время работы указанного процесса в миллисекундах (возвращает число двойной длины). Принимает PID в качестве аргумента.

Пример:

#( test_procactivetime
NoActive
Action:
    S" notepad.exe" PROC-EXIST? ?DUP
    IF
        \ выводим время работы notepad на консоль
        ProcActiveTime D>S . CR
    ELSE
        MSG: "Notepad is not started!"
    THEN
)#

PROC-EXIST: "proc_pattern"

Возвращает флаг TRUE (-1), если процесс, подпадающий под маску существует. В качестве аргумента к слову PROC-EXIST: обычно используется имя исполняемого файла, который запускает процесс.

Пример:

Rule: PROC-EXIST: "winword.exe"

Можно идентифицировать процесс не только по имени исполняемого файла, но и по полному пути приложения. Для этого используйте опцию PROC-FULLPATH. Идентификация процесса по полному пути приложения происходит также если в имени процесса присутствует хотя бы один обратный слеш ('\').

Пример:

Rule: PROC-FULLPATH PROC-EXIST: "C:\PROGRAM FILES\OPERA\opera.exe"
Rule: PROC-EXIST: "C:\PROGRAM FILES\OPERA\opera.exe"

Если нужно узнать PID процесса, воспользуйтесь постфиксным словом PROC-EXIST?

Пример:

\ кладет на стек PID 'winword.exe'
S" winword.exe" PROC-EXIST?

PROC-FULLNAME ( pid - a u)
PROC-NAME ( pid - a u)

Постфиксные слова, которые возвращают строку, содержащую полное/короткое имя процесса по его PID. Слово PROC-NAME возвращает имя исполняемого файла (скажем, notepad.exe), а PROC-FULLNAME возвращает имя процесса, вместе с путем к исполняемому файлу (c:\windows\system32\notepad.exe).

Пример:

#( test_procname
WatchProc: "notepad.exe"
Action:
    \ выводим короткое имя процесса на консоль:
    WATCH-PROC-ID PROC-NAME TYPE CR
    \ выводим полное имя процесса в сообщении:
    MSG: "%WATCH-PROC-ID PROC-FULLNAME%" 
)#

PROC-WAIT-IDLE ( pid -- )

Постфиксное слово, которое приостанавливает работу задачи до тех пор, пока указанный процесс не станет idle. Основная сфера применения - дождаться завершения загрузки программы, запущенной с помощью START-APP:.

Пример:

#( test_start_app
NoActive
Action:
    START-APP: your_prog.exe
    \ приостанавливаем задачу до полной загрузки your_prog.exe
    PROC-ID PROC-WAIT-IDLE
    \ продолжаем работу задачи
    \ ...
)#

proc_pattern - это имя процесса или маска имени процесса. Обычно имя процесса - это имя исполняемого файла, который запускает интересующий нас процесс. Задавая маску имени или полного пути процесса можно применять символы '*' и '?' или регулярные выражения, заключив их в прямые слеши: /<regexp>/.
В качестве имени процесса можно указывать не только имя исполняемого файла, но и полный путь к нему. Маска сравнивается с полным путем исполняемого файла, если в ней присутствует хотя бы один обратный слеш ('\').
Также в proc_pattern можно использовать идентификатор процесса (см. PROC-ID, %WATCH-PROC-ID%).

Примеры:

\ имя процесса
PROC-EXIST: "notepad.exe"
\ маска имени процесса
PROC-EXIST: "notepad*"
PROC-EXIST: "*pad.exe" \ маски имени процесса с учетом пути к исполняемому файлу PROC-EXIST: "*\notepad*" PROC-EXIST: "c:\*\notepad.exe" \ регулярное выражение PROC-EXIST: "/(note)|(word)pad.exe/i" \ идентификатор процесса PROC-EXIST: "1116"
PROC-EXIST: "%WATCH-PROC-ID%"
PROC-EXIST: "%my_proc_id @%"

См. также: