2009-05-13 14 views
8

¿Hay alguna forma de detectar cuántos procesos de matlab se están ejecutando en una computadora desde un programa de matlab?Detectar procesos de matlab desde dentro de matlab

Me gustaría tener exactamente n procesos de matlab en ejecución. Si tengo muy pocos, quiero crearlos y si tengo muchos, quiero matarlos. Por supuesto, puede hacerlo manualmente, pero preferiría que sea automático si es posible y no complicado de implementar.

Información adicional: Actualmente estoy usando windowsx64 (vista), pero también me interesan otras plataformas.

+1

Gracias a todos por las respuestas! Me gustaría aceptar todas sus respuestas s. – AnnaR

Respuesta

11

Si estás en Windows, usted puede hacer esto:

[s,w] = dos('tasklist'); 
numMatlabs = length(regexp(w, '(^|\n)MATLAB.exe')) 
+0

¡Funciona como un encanto! – AnnaR

3

en Linux

!ps -ef |grep "/usr/local/matlab78/bin/glnxa64/MATLAB"|wc -l 

haría el truco (sustituya la ruta por su cuenta y restar 1 para el proceso grep)

(sea para incorporar a una función, utilice

[tmp, result] = system('ps -ef |grep "/usr/local/matlab78/bin/glnxa64/MATLAB"|wc -l'); 
str2double(result) - 1 

también, usted puede usar

>>computer 
ans = GLNXA64 

para saber qué arquitectura del sistema (Win/Linux/etc) un programa se está ejecutando actualmente en

+0

Linux supongo? – AnnaR

+0

seguro. ver arriba para consejos para Windows. >> computadora le dirá qué sistema está ejecutando actualmente (para hacer que su código sea portátil) – second

+0

Este enfoque no puede diferenciar entre DOS instancias de MATLAB en ejecución - probablemente devolverá el mismo ID (aleatorio) si se llama desde dos o más sesiones –

2

Con respecto a la detección cuántos Los procesos de MATLAB se están ejecutando actualmente en su máquina, probablemente vaya con the answer Edric gave. A partir de ahí, debes detener algunos de ellos o comenzar nuevos. Aquí hay un código (usando el método Edrics) que detectará la cantidad de procesos de MATLAB, abrirá nuevos e inmediatamente ejecutará código en ellos. Todavía estoy buscando en la parte del proceso que mata ...

[s,w] = dos('tasklist'); 
nProcesses = numel(regexp(w,'(^|\n)MATLAB.exe')); 
for n = 1:(3-nProcesses), % Starts new processes if there are less than 3 
    dos('MATLAB R2009a -nosplash -r why &'); % Starts a process and runs the 
              % built-in function "why.m" 
end 

Asumiendo que tiene 1 a iniciar un proceso en ejecución, este código se iniciará 2 más y luego devolver el control al proceso de MATLAB originales (debido a la " & "en la llamada a la función DOS). Cuando inicia cada uno, automáticamente llamará a la función MATLAB incorporada POR QUÉ (debido al "-r por qué" en la llamada a DOS), lo que resulta en el siguiente texto que aparece en cada nueva ventana:

El hámster calvo y no excesivamente calvo y no excesivamente inteligente obedecía a un hámster aterrorizado y no excesivamente aterrorizado.

Al reemplazar "por qué" en la llamada a DOS con cualquier código/archivo-m que desee ejecutar, puede generar nuevos procesos que comiencen instantáneamente a procesar números.


Usando el paralelo Computing Toolbox:

(Esta es una versión antigua de mi respuesta me voy de aquí en caso de que alguien le resulta útil)

Si está utilizando la Caja de herramientas de computación en paralelo para crear un grupo de trabajadores de MATLAB, le recomendamos que consulte la función MATLABPOOL.Aquí hay algunas maneras de usarlo:

>> poolSize = matlabpool('size') % Check the current pool size 

poolSize = 

    0 

>> matlabpool('open',2); % Open a pool of 2 workers 
Starting matlabpool using the 'local' configuration ... connected to 2 labs. 
>> poolSize = matlabpool('size') % Check the pool size again 

poolSize = 

    2 

>> matlabpool('close'); % Close the pool of workers 
Sending a stop signal to all the labs ... stopped. 
+0

La caja de herramientas paralela es demasiado costosa. En lugar de tirarle dinero a mi problema, estoy trabajando en ello. Esta es la única parte restante, simplemente no quiero iniciar los procesos manualmente. – AnnaR

+0

Iniciar procesos es fácil, pero matarlos es más complicado. No querrás matar accidentalmente el proceso que ejecuta tu código matlab. Otra forma de iniciar un proceso de MATLAB es: MATLAB & – AnnaR

0

¿Desea escribir algunos VBScript? Puede crear una secuencia de comandos usando WMI, una API de administración de Windows con enlaces de scripts. WMI puede enumerar todos los procesos en una máquina, incluidos el nombre de la imagen, la ruta y la línea de comando. Busque el MATLAB.exes. El objeto Win32_Process de WMI también expone la mayor parte de la información que muestra Process Explorer, como la hora de inicio, la CPU y el uso de la memoria.

Puede casi script WMI desde dentro de Matlab utilizando actxserver() y las llamadas al método COM, pero las colecciones no funcionan del todo bien. Pero puede escribir un VBS simple para hacer la consulta de la lista de procesos de WMI y escribir resultados compatibles con Matlab, y luego pagarlos. Este es un trabajo más que utilizar la lista de tareas, pero es posible que la información adicional le resulte útil si está resolviendo varios procesos de trabajo. Por ejemplo, las líneas de comando, los títulos de las ventanas o los tiempos de inicio del proceso podrían usarse para diferenciar a los trabajadores al decidir qué matar.

Para matarlos, puede usar Win32_Process.Terminate de WMI, o pagar al comando taskkill.

Esto es todo solo para Windows. Si desea que las cosas sean portátiles, puede instalar cygwin, y luego pagar las unidades ps de estilo Unix y cancelar comandos en cualquier sistema operativo.

nota

lateral: si usted está haciendo regulares aplicaciones de Windows Matlab actúan como trabajadores con "r", utilizar un try/catch en el nivel superior de su script principal para asegurarse de que salga al terminar:

try 
    do_your_work(); 
catch err 
    warning('Got an error: %s', err.message); 
end 

close force all % prevent figures from making quit() balk 
quit force 

De lo contrario, un error en el código M podría aparecer hasta el nivel superior y colocar Matlab en el bucle principal de la GUI en espera de la entrada del usuario, y se verá como un trabajador colgado.

Ah, y si estás matando los procesos Matlab de Matlab, probablemente quieras evitar matarte. Aquí hay una función MEX que le permitirá determinar su propio pid en Windows64 o Unix; compruébelo con los pides de los procesos objetivo al elegir víctimas. Fancier ifdefs lo hará funcionar en win32.

/* mygetpid.c - MEX function to get PID */ 
#ifdef _WIN64 
#include <process.h> 
#define GETPID _getpid 
#else 
/* assume we're on Unix */ 
#include <unistd.h> 
#define GETPID getpid 
#endif 
#include "mex.h" 

void mexFunction(int nlhs,  mxArray *plhs[], 
       int nrhs, const mxArray *prhs[] 
       ) 
{ 
    /* ... a real function would have nargin/nargout checks here... */ 
    plhs[0] = mxCreateDoubleScalar((int) GETPID()); 
} 
+2

Si te gusta su código indocumentado y sin apoyo, siempre hay característica ('getpid') – Edric

+0

@Edric: Argh, no sabía nada de función ('getpid'). Eso me habría ahorrado una buena cantidad de trabajo. –

5

Aquí hay otro enfoque: se puede utilizar de Matlab COM "servidor de automatización" para poner en marcha los trabajadores y controlarlos desde el centro de un proceso Matlab.

function out = start_workers(n) 
myDir = pwd; 
for i=1:n 
    out{i} = actxserver('matlab.application.single'); 
    out{i}.Execute(sprintf('cd(''%s'')', myDir)); 
end 

Luego puede usar Execute() para que funcionen. Podría usar un truco de temporizador para obtener una especie de ejecución asincrónica.

function out = evalasync(str) 
%EVALASYNC Asynchronous version of eval (kind of) 
% 
% evalasync(str) % evals code in str 
% evalasync()  % gets results of previous call 

persistent results status exception 

if nargin == 0 
    out = {status results exception}; % GetWorkspaceData doesn't like structs 
    assignin('base', 'EVALASYNC_RESULTS', out); % HACK for Automation 
    return 
end 

status = 'waiting'; 
    function wrapper(varargin) 
     status = 'running'; 
     try 
      results = eval(str); 
      status = 'ok'; 
     catch err 
      status = 'error'; 
      exception = err; 
     end 
    end 

t = timer('Tag','evalasync', 'TimerFcn',@wrapper); 
startat(t, now + (.2/(60*60*24))); 

end 

Entonces

w = start_workers(3); 
w{1}.Execute('evalasync(''my_workload(1)'')'); 
w{2}.Execute('evalasync(''my_workload(2)'')'); 

Por desgracia, le pegan con una sola rosca en los trabajadores, por lo que si usted llama evalasync() de nuevo para comprobar los resultados, se bloqueará. Por lo tanto, querrá controlar su progreso a través de los archivos en el disco. Entonces puede que no sea una gran victoria.

1

Usando TASKLIST de Windows también puede obtener el PID de una tarea en ejecución específica utilizando el título de la ventana como un filtro. Esto es especialmente útil si tiene varios procesos de Matlab de los cuales ha cambiado el título.

Al cambiar el título de la ventana principal de Matlab se realiza utilizando la siguiente función (changeWindowTitle.m):

function changeWindowTitle(str) 

% first get all of the Java frames present in the current JVM 
frms = java.awt.Frame.getFrames(); 

% now, lets look through those frames for one that seems like it 

root = []; 
for m = 1:length(frms) 
    if strcmpi(get(frms(m),'Type'),'com.mathworks.mde.desk.MLMainFrame') 
     root = frms(m); 
     break; 
    end 
end 
if isempty(root) 
    error('Could not find my main frame') 
end 
set(root,'Title',str) 

Si ha modificado el título de la ventana Matlab para "MyMatlabWindow" usando ....

> changeWindowTitle("MyMatlabWindow"); 

... se puede encontrar la sesión de esta Matlab PID desde fuera Matlab usando:

c:\tasklist /FI "WindowTitle eq MyMatlabWindow" 

Por supuesto, puede hacer lo mismo desde Matlab utilizando dos()system() o el signo de admiración. .

Además, se pueden agregar los argumentos /FO CSV (para dar formato a la salida como CSV) y /NH (para suprimir la salida de la cabecera

c:\tasklist /FI "WindowTitle eq MyMatlabWindow" /FO CSV /NH 

Fuentes: