2009-05-13 5 views
8

matlab 프로그램 내에서 컴퓨터에서 실행중인 matlab 프로세스 수를 확인할 수있는 방법이 있습니까?matlab에서 matlab 프로세스 감지

정확히 n 개의 MATLAB 프로세스를 실행하고 싶습니다. 내가 너무 적 으면 나는 그들을 만들고 싶다. 그리고 내가 많이 가지고 있다면 나는 어떤 것을 죽이고 싶다. 물론 이것을 수동으로 할 수는 있지만 가능하다면 자동으로 실행하고 구현하기가 복잡하지 않아야합니다.

추가 정보 : 현재 windows x64 (vista)를 사용하고 있지만 다른 플랫폼에도 관심이 있습니다. 리눅스에서

+1

답변 해 주셔서 감사합니다. 답변을 모두 수락하고 싶습니다. 에스. – AnnaR

답변

11

에 실행 (승/리눅스/등)을 찾아, 당신이 할 수 있습니다 :

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

매력처럼 작동합니다! – AnnaR

3

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

트릭 (은 grep 프로세스 (1) 자신에 의해 경로를 교체하고 빼기를) 할 것

(또는 기능에 구축, 사용

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

도 사용할 수 있습니다.

>>computer 
ans = GLNXA64 
,210

어떤 시스템 아키텍처 프로그램이 현재 Windows에서 경우

+0

Linux 나는 추정합니까? – AnnaR

+0

. 위의 창 팁을 참조하십시오. >> 컴퓨터 은 현재 실행중인 시스템을 알려줍니다 (코드를 이식 가능하게하기 위해) – second

+0

이 접근법은 두 개의 실행중인 MATLAB 인스턴스를 구별하지 못합니다 - 두 개 이상의 호출에서 동일한 id를 반환합니다 세션. –

2

을 관련하여 얼마나 많은 검출에 MATLAB 프로세스가 현재 컴퓨터에서 실행 중이므로 the answer Edric gave과 함께 갈 것입니다. 거기에서, 그 중 일부를 중지하거나 새로운 것을 시작해야합니다. 다음은 MATLAB 프로세스의 수를 감지하고 새 프로세스를 열고 즉시 코드를 실행하는 코드 (Edrics 메소드 사용)입니다. 난 아직도 당신이 시작하는 실행 한 프로세스가 가정

[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 

... 과정을 죽이는 부분으로 찾고 있어요,이 코드는 2 개를 시작하고 다음 인해 (원본 MATLAB 공정 제어를 반환 " & "을 호출하면 DOS 함수로 호출됩니다. 각각을 시작하면 자동으로 내장 MATLAB 함수 WHY (DOS 호출에서 "-r why"로 인해)가 호출되어 각 새 창에 다음 텍스트가 표시됩니다.

대머리이고 과도하게 대머리가 아니고 너무 똑똑하지 않은 햄스터는 겁에 질려 지나치게 두려워하지 않는 햄스터에게 복종했습니다.

실행하려는 코드/m 파일이있는 DOS 호출에서 "이유"를 바꾸면 즉시 번호를 시작하는 새 프로세스를 생성 할 수 있습니다. 당신이 사용하는 경우

(이 내 대답 나는 경우 누군가 여기에 떠날거야가 이전 버전입니다 도움을 발견) : 병렬 컴퓨팅 도구 상자를 사용하여


Parallel Computing Toolbox를 사용하여 MATLAB 작업자 풀을 만들려면 MATLABPOOL 함수를 살펴보아야합니다.다음은 몇 가지 사용 방법입니다.

>> 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

병렬 도구 상자가 너무 비쌉니다. 내 문제에서 돈을 버는 대신 나는 그 문제를 해결하려고 노력하고있다. 이 부분 만 남아 있습니다. 프로세스를 수동으로 시작하고 싶지 않습니다. – AnnaR

+0

시작 프로세스는 쉽지만 죽이는 것은 더 까다 롭습니다. 실수로 당신이 matlab에 코드를 실행하는 프로세스를 죽이고 싶지 않아요. ! matlab & – AnnaR

0

일부 VBScript를 쓰고 싶으십니까? 스크립트 바인딩을 사용하는 Windows 관리 API 인 WMI을 사용하여이 스크립트를 작성할 수 있습니다. WMI는 이미지 이름, 경로 및 명령 줄을 포함하여 컴퓨터의 모든 프로세스를 나열 할 수 있습니다. MATLAB.exes를 검색하십시오. WMI의 Win32_Process 개체는 시작 시간, CPU 및 메모리 사용량과 같은 Process Explorer에 표시되는 대부분의 정보도 노출합니다.

거의 스크립트 WMI actxserver() 및 COM 메서드 호출을 사용하여 Matlab 자체에서 가져올 수 있지만 컬렉션이 아직 제대로 작동하지 않습니다. 그러나 간단한 VBS를 작성하여 WMI 프로세스 목록 쿼리를 수행하고 Matlab에 친숙한 출력을 작성한 다음 쉘에 출력 할 수 있습니다. 이것은 작업 목록을 사용하는 것보다 더 많은 작업이지만, 작업자 프로세스가 번거롭다면 추가 정보가 유용 할 수 있습니다. 예를 들어 명령 줄, 창 제목 또는 프로세스 시작 시간을 사용하여 죽일 대상을 결정할 때 작업자를 구분할 수 있습니다.

그들을 죽이려면 WMI의 Win32_Process.Terminate 또는 shell을 taskkill 명령에 사용할 수 있습니다.

이것은 모두 Windows 전용입니다. 이식성을 높이려면 cygwin을 설치 한 다음 두 OS에서 Unix 스타일 ps 및 kill 명령으로 쉘을 만들 수 있습니다.

사이드 참고 : 일반 윈도우의 MATLAB 애플 리케이션 "-r"확인하기 위해 주요 스크립트의 맨 수준에서 시도/캐치를 사용하는 노동자의 역할을하게하는 경우 확인이 완료되면 종료됩니다

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 

그렇지 않으면 M 코드에서 발생한 오류로 인해 최상위 레벨까지 올라갈 수 있고 Matlab을 기본 GUI 루프에 놓아 사용자 입력을 기다릴 수 있습니다. 그러면 정지 된 직원처럼 보입니다.

아, 그리고 Matlab에서 Matlab 프로세스를 죽이는 경우, 아마도 자신을 죽이지 않는 것이 좋습니다. 다음은 Windows64 또는 Unix에서 자신의 pid를 결정할 수있는 MEX 기능입니다. 희생자를 선택할 때 대상 프로세스의 pid와 대조하여 확인하십시오. 더 깔끔한 ifdefs는 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

코드가 문서화되지 않았고 지원되지 않는 경우 항상 feature ('getpid')가 있습니다 – Edric

+0

@Edric : Argh, 기능에 대해 몰랐습니다. ('getpid'). 그것은 저에게 많은 양의 일을 덜어 줬을 것입니다. –

5

Matlab의 COM "자동화 서버"를 사용하여 작업자를 시작하고 중앙 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 

그런 다음 Execute()를 사용하여 작업을 실행할 수 있습니다. 타이머 트릭을 사용하여 일종의 비동기 실행을 얻을 수 있습니다.

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 

은 다음

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

은 불행하게도, 당신은 노동자의 단일 스레드와 함께 붙어있는, 그래서 당신이 결과를 확인하기 위해 다시) evalasync를 (호출하는 경우, 그것을 차단하는 것입니다. 따라서 디스크의 파일을 통해 진행 상황을 모니터링하고 싶을 것입니다. 그래서 그것은 많은 승리가 아닐 수도 있습니다.

1

Windows 'TASKLIST를 사용하면 창 제목을 필터로 사용하여 특정 실행중인 작업의 PID를 얻을 수도 있습니다. 이는 타이틀을 변경 한 여러 MATLAB 프로세스가 실행 중일 때 특히 유용합니다.

Matlab 메인 윈도우 타이틀 변경은 다음 함수 (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) 

사용 "MyMatlabWindow"에 matlab에 창 제목을 수정 한 경우 ....

> changeWindowTitle("MyMatlabWindow"); 

... 사용 matlab에 외부에서이 matlab에의 세션 PID를 찾을 수 있습니다

c:\tasklist /FI "WindowTitle eq MyMatlabWindow" 

물론 dos()system() 또는 느낌표를 사용하여 Matlab에서 동일한 작업을 수행 할 수 있습니다. .

또한, 헤더의 출력을 억제하기 위해 (/FO CSV 인수를 추가 (CSV로 출력을 포맷하는) 및 /NH

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

출처 :