Хотите написать какой-нибудь VBScript? Вы можете написать это, используя WMI , API-интерфейс администрирования Windows с привязками сценариев. WMI может перечислить все процессы на компьютере, включая имя образа, путь и командную строку. Ищите MATLAB.exes. WMI-объект Win32_Process также предоставляет большую часть информации, отображаемой Process Explorer , например время запуска, использование процессора и памяти.
Вы можете почти сценарий WMI изнутри самого Matlab, используя actxserver () и вызовы COM-методов, но коллекции пока работают не совсем правильно. Но вы можете написать простую VBS, чтобы выполнить запрос списка процессов WMI и написать вывод, дружественный к Matlab, а затем обработать его. Это немного больше, чем использование списка задач, но вам может пригодиться дополнительная информация, если вы спорите с кучей рабочих процессов. Например, командные строки, заголовки окон или время запуска процесса могут использоваться для разграничения работников при принятии решения о том, кого убивать.
Чтобы уничтожить их, вы можете использовать Win32_Process.Terminate или WMI для команды taskkill.
Это только для Windows. Если вы хотите сделать вещи переносимыми, вы можете установить cygwin, а затем выполнить оболочку для ps в стиле Unix и команды kill в любой ОС.
Примечание: если вы заставляете обычные приложения Windows Matlab работать как работники с "-r", используйте try / catch на самом верхнем уровне основного сценария, чтобы убедиться, что он завершится, когда закончите:
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
В противном случае ошибка, выдаваемая в М-коде, может всплыть на верхний уровень и привести к тому, что Matlab попадет в основной цикл GUI, ожидая ввода данных пользователем, и будет выглядеть как зависший работник.
О, и если вы убиваете процессы Matlab из Matlab, вы, вероятно, хотите избежать самоубийства. Вот функция MEX, которая позволит вам определить свой собственный pid в Windows64 или Unix; проверяйте его по пидам целевых процессов при выборе жертв. Любитель 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());
}