I currently call MATLAB in background mode...
You'll probably have to consult the MATLAB documentation on how to run the program in a way that it doesn't return before having finished. Maybe running it in the background isn't the way to go... Can you run it in batch mode (i.e. without the GUI), but in the foreground?
Or, if that's not possible, you could maybe let the MATLAB job create a certain file when done (acting as a "finished" flag), whose existence you could then poll from your Perl script.
| [reply] |
You didn't tell us which platform you're on (Windows? Unix?). What does the system call return?
Some Ideas (since you cannot post code, we can try to guess your approach / chose a number next time ;-):
- system("....matlab someargs &"); --- get rid of the &
- system("nohup ....matlab someargs &"); --- get rid of nohup and &
- system("....matlab someargs"); --- check if matlab is a script that in turn starts a background process
- system("....matlab someargs"); --- something special about someargs?
- ...
Your Perl program could identify the MATLAB PID and wait (checking for the PID's existence periodically)
until the process terminates before starting the next script.
- Update:
- Nothing to be sorry for. I'am not familiar enough with Windows and Matlab to
give you any further suggestions... ok, maybe yet another:
I found a tutorial that looks quite good. There, the batch mode
is described (see section: Getting Started).
There, the exit command is suggested to terminate batch-runs. So I assume, the batch mode has to be terminated explicitly. Maybe check your *.m files for any
occurrences of exit that might terminate the script execution early and modify your command to
matlab -sd Directory -r File1;File2;exit ... maybe that helps? You can even call Perl
programs from Matlab (see here
; shell scripts also). So another workaround might be the creation of File3.m that just contains a
perl() or system() call to start your 3rd script? Well, at least the true Matlab hackers
have something to grin ;-)
| [reply] [d/l] [select] |
Sorry about that. I'm running on Windows XP.
As for the system call, I can give you the dos command equivalent, which is matlab -sd Directory -nosplash -r File1;File2 where Directory is the directory containing the files to run, -nosplash makes it run in background mode (I first tested it in GUI mode to make sure everything worked), and -r Files contains the files to be run. Perl behaves the same regardless of whether or not MATLAB is in background mode. I will try your suggestion to check for the PID periodically.
| [reply] [d/l] |
I have done something similar - though not exactly the same - with Win32::Process::Create. That gives you a $ProcessObj->Wait($timeout) method. However, from your description, I suspect that this will return immediately.
If Wait() does return immediately, you should be able to find an entry in the tasklist for what is running and check that periodically for the programs completion. Without being more familiar with MATLAB, I can't be any more specific.
| [reply] |
I agree with Perlbotics that your Perl program should just look for the PID of Mathlab and wait for it to finish. Or you can do something like
ps aux | grep <mathlab process>
and wait for this process to finish. | [reply] [d/l] |
Or, if it writes something in the log that indicates it has finished, monitor the log file to see when that something appears. If it writes its PID in the log file, even better: get the PID from there, then waitpid for it.
| [reply] [d/l] |