in reply to capture periodic updates from external program

As long as your using javascript already, I think I would use something like Progress Bar. Have the background process write to a file instead of STDOUT, and make a little CGI script to serve up the value in the file. javascript takes care of the rest, pinging the CGI until it sees 'complete' or whatever, and puts up a 'congratulations-your done' message. The background process can delete-previous/create-new file on startup(submit) with a unique name for that session which is handed back to the browser on submit at the beginning of the process, thus informing ajax of what it needs to request.

So I tossed this out here as an idea, but I would guess it has some holes in it. Will be interested to hear what others have done... .

Just a thought....

...the majority is always wrong, and always the last to know about it...
Insanity: Doing the same thing over and over again and expecting different results...
  • Comment on Re: capture periodic updates from external program

Replies are listed 'Best First'.
Re^2: capture periodic updates from external program
by mabossert (Scribe) on May 12, 2014 at 22:22 UTC

    Thanks for the feedback! I appreciate the response...but I guess I was not clear with my desired outcome...I am using this: http://demos.telerik.com/kendo-ui/web/progressbar/index.html. Which will definitely handle everything for me as you suggested with ProgressBar (javascript library).

    My main concern is actually with the mechanics of the loop that will supply the updated progress. I need to start execution, then (in a loop) periodically send the progress updates through a web socket message...until the program finishes.

    I know I can kick off execution with open3 or run3, and then watch STDOUT from that program...but how do I break out of the loop? I guess I am not very familiar with how those libraries handle the file handles for STDOUT/ERR.

    I wonder if something like this would work as intended?

    ... run3 "somecommand -i somefile -o someoutputfile", $stdout, $stderr; while(my $line = <$stdout>) { if($line =~ m/Progress: (\d+) lines processed/) { # Assume that $ws is the web socket object I have created and will + allow for the message to be sent... $ws->send($1); } }