Killing .exe program started from Matlab

2 views (last 30 days)
Francesco
Francesco on 19 Jul 2012
I am doing an optimization with ga (with matlabpool parallel computing). From within my function evaluation, I call an external .exe program (XFoil, somebody might know it). At the moment I am simply using "system" for running the .exe program.
system(['xfoil.exe < prof_name.cmd > prof_name.out']);
where prof_name.cmd is an input file for the program and prof_name.out a file that I ask only for avoiding having my screen full of useless messages.
My problem is that sometimes the .exe program gets in a loop and, therefore, the control does not go back to Matlab and my optimization gets stuck. Thus, I would like to kill the .exe after a given time but this is not possible using the system command.
Does anybody have a suggestion?
Thanks
P.S. I considered assembling a job (one per generation) calling several tasks (the evaluation of the individuals) and using the timeout property:
set(j, 'Timeout', 60)
to end the task. Although this would unlock the optimization, it would also leave several instances of the .exe program running (thus quickly reducing the available computational power)
  3 Comments
Francesco
Francesco on 19 Jul 2012
By the way.
The solution reported here: http://www.mathworks.ch/matlabcentral/answers/43823-running-external-program-from-matlab-for-a-given-amount-of-time is not working since I have several instances of the .exe program running and I want to kill just one of them.
Concerning the more general purpose answer, I fear it might be a bit too generic for my understanding...
Francesco
Francesco on 19 Jul 2012
Thanks Jan Simon.
I am using Matlab 2012a on a Mindows 7 64bit. I am using a local matlabpoool, so the .exe runs on the same computer running matlab. By the way, the .exe is located in the work folder.
Unfortunately I was not able to avoid the .exe getting stuck (it is happening to others as well). I know it is not nice but at the end I had to accept it..

Sign in to comment.

Answers (2)

Jan
Jan on 19 Jul 2012
You can obtain the ProcesID using the OS-command tasklist. Then the task can be kill by taskkill.
The identification of a started task in the tasklist output is not trivial. It would be smarter to start the exe using spawn in a C-mex function, such that you get the ProcessID directly. Perhaps these FEX submissions help: FEX: spawn and FEX: clientserver-framework.
  2 Comments
Francesco
Francesco on 20 Jul 2012
Edited: Francesco on 20 Jul 2012
Thank you Jan Simon
As you said, the tricky part is to get the PID. A colleague already suggested running tasklist before and after system in order to see the PID of the created task. However, due to the parallel nature it is quite probably that I will have several jobs starting at the same time and the trick would probably not work.
I had a look at the FEX submissions you suggested. If I am not wrong, the first one does not give back the PID. The second is unfortunately for Linux only...
Jan
Jan on 20 Jul 2012
Althout it does not reply the PID directly, you could be able to modify the code such that it does. If the C-stuff is not your business, adjust the code as far as you can and post a new question in this forum.

Sign in to comment.


Francesco
Francesco on 23 Jul 2012
I finally decided to save time and go for a dirty solution.
I replicated the .exe file (one per lab). Now every lab calls program_labID, so that I can always kill the program_labID task being sure that it will only affect the lab I want.
I know it's super ugly, but unfortunately I was unable to get anything cleaner. Thank you anyhow for the help!
  1 Comment
Jan
Jan on 23 Jul 2012
No, this is not super ugly. You could create hard-links to avoid data duplication.

Sign in to comment.

Categories

Find more on Develop Apps Using App Designer in Help Center and File Exchange

Products

Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!