Beefy Boxes and Bandwidth Generously Provided by pair Networks
Your skill will accomplish
what the force of many cannot
 
PerlMonks  

Re: Calling External Program

by Perlbotics (Archbishop)
on Jun 03, 2009 at 21:30 UTC ( [id://768179]=note: print w/replies, xml ) Need Help??


in reply to Calling External Program

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 ;-):

  1. system("....matlab someargs &"); --- get rid of the &
  2. system("nohup ....matlab someargs &"); --- get rid of nohup and &
  3. system("....matlab someargs"); --- check if matlab is a script that in turn starts a background process
  4. system("....matlab someargs"); --- something special about someargs?
  5. ...
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 ;-)

Replies are listed 'Best First'.
Re^2: Calling External Program
by Anonymous Monk on Jun 04, 2009 at 12:48 UTC
    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.
      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.

        Thanks for the feedback, but I found a simpler solution. After convincing my colleagues that the order the programs are called in doesn't really matter, simply calling MATLAB last solves the problem.

Log In?
Username:
Password:

What's my password?
Create A New User
Domain Nodelet?
Node Status?
node history
Node Type: note [id://768179]
help
Chatterbox?
and the web crawler heard nothing...

How do I use this?Last hourOther CB clients
Other Users?
Others imbibing at the Monastery: (5)
As of 2024-04-19 20:07 GMT
Sections?
Information?
Find Nodes?
Leftovers?
    Voting Booth?

    No recent polls found