<div class="gmail_quote">On 18 September 2011 22:15, Chris Hicks <span dir="ltr"><<a href="mailto:silent_vendetta@hotmail.com">silent_vendetta@hotmail.com</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex;">




<div><div dir="ltr">
I was thinking about this some more, and doing some more reading, and if I have a process which uses os:cmd on a unix box to run the escript and if doing so starts up a full Erlang node, is there any reason that the Pid of the calling process couldn't be passed as one of the arguments? Couldn't the script simply send a message to that Pid and once the script exits and returns a value to the process that called os:cmd, that process would then do a receive to retrieve the message?</div>
</div></blockquote><div><br></div><div>As I said previously, I'm not 100% sure about escripts being part of a distributed system, but check it out and see if it works.</div><div><br></div><div>In terms of passing on the pid, as Jon mentioned you should probably pass on a globally registered name, which you can handle with either the global module or <a href="https://github.com/esl/gproc">https://github.com/esl/gproc</a> (I favour the latter personally).</div>
<div><br></div><div>I'd also suggest rather than using os:cmd, that you consider erlang:open_port so that you can check the return code to see whether the script executed successfully or not. I'll post an example at the bottom of this main. </div>
<div> </div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex;"><div><div dir="ltr"><div><br></div><div>On a related note, can an escript be run as a text string instead of a file residing on the system? Basically, I'm trying to figure out if I can just hold all my scripts in a DB, pull them out as needed and execute them rather than actually creating a file that is run.<br>
</div></div></div></blockquote><div><br></div><div>Yes sort of. The escript module has functions to handle this kind of thing, for example from <a href="http://www.erlang.org/doc/man/escript.html">http://www.erlang.org/doc/man/escript.html</a>:</div>
<div><br></div><div><div>{ok, Bin} = escript:create(binary, [shebang, comment, {emu_args, "-smp disable"},</div><div>                                      {source, list_to_binary(Source)}]),</div><div>%% {ok,<<"#!/usr/bin/env escript\n%% This is an -*- erlang -*- file\n%%!-smp disabl"...>>}</div>
<div>file:write_file("demo.escript", Bin).</div></div><div><br></div><div>You can also zip together a bunch of module beam files to form into an escript, which allows you to guarantee modules will be loaded by the code server when the script is executed. Rebar provides support for doing this as part of a build process: take a look at <a href="https://github.com/basho/rebar/blob/master/src/rebar_escripter.erl">https://github.com/basho/rebar/blob/master/src/rebar_escripter.erl</a> to see how it works. Using a mechanism like this, you could store a blob containing the code and pull this out at runtime, optionally modify it and then write it to a temporary file location prior to executing the script(s). </div>
<div><br></div><div>To get feedback from the executable, you can do something like this quick, not production worthy, hack:</div><div><br></div><div><div>exec(Command) -></div><div>    exec(Command, []).</div><div><br>
</div><div>exec(Command, Env) -></div><div>    PortSettings = [exit_status, {line, 16384}, stderr_to_stdout, hide],</div><div>    sh_loop(open_port({spawn, Command}, PortSettings ++ Env), []).</div><div><br></div><div>
sh_loop(Port, Acc) -></div><div>    receive</div><div>        {Port, {data, {eol, Line}}} -></div><div>            sh_loop(Port, [Line ++ "\n" | Acc]);</div><div>        {Port, {data, {noeol, Line}}} -></div>
<div>            sh_loop(Port, [Line | Acc]);</div><div>        {Port, {exit_status, 0}} -></div><div>            {ok, lists:flatten(lists:reverse(Acc))};</div><div>        {Port, {exit_status, Rc}} -></div><div>            {error, {Rc, lists:flatten(lists:reverse(Acc))}}</div>
<div>    end.</div></div><div><br></div><div><br></div><div>Cheers,</div><div><br></div><div>Tim</div><div><br></div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex;"><div>
<div dir="ltr"><div><div><hr>From: <a href="mailto:silent_vendetta@hotmail.com" target="_blank">silent_vendetta@hotmail.com</a><br>To: <a href="mailto:watson.timothy@gmail.com" target="_blank">watson.timothy@gmail.com</a><br>
Date: Sun, 18 Sep 2011 10:57:24 -0700<div class="im"><br>CC: <a href="mailto:erlang-questions@erlang.org" target="_blank">erlang-questions@erlang.org</a><br></div><div class="im">Subject: Re: [erlang-questions] escript question<br>
<br>





<div dir="ltr">
Thanks for the response, Tim. The first two were along the lines of what I was thinking I'd need to do, though I didn't know about file:consult/1 which could come in very handy for a couple other things I'm working on. I'm leaning a bit more towards #1 though simply because in the system I'm building there could be anywhere from dozens to hundreds of these scripts being fired off each second and, without having spent much time thinking about it, I imagine trying to filter the appropriate structure back to the appropriate process which fired off the escript via method #2 would just add some unnecessary complexity.<div>
<br><div><hr>Date: Sun, 18 Sep 2011 18:44:24 +0100<br>Subject: Re: [erlang-questions] escript question<br>From: <a href="mailto:watson.timothy@gmail.com" target="_blank">watson.timothy@gmail.com</a><br>To: <a href="mailto:silent_vendetta@hotmail.com" target="_blank">silent_vendetta@hotmail.com</a><br>
CC: <a href="mailto:erlang-questions@erlang.org" target="_blank">erlang-questions@erlang.org</a><br><br>1. write it to a file and use file:consult/1 to grab the result.<div>2. write it back to stdout and use erl_parse/erl_eval</div>
<div>3. use emu_args to get the escript hooked into the distribution protocol and use rcp:call to send the result back</div>
<div><br></div><div>Not actually sure about (3) as I've never done that, but the other two work fine and are simple to implement.</div><div><br></div><div>Cheers,</div><div><br></div><div>Tim<br><br><div>
On 18 September 2011 17:49, Chris Hicks <span dir="ltr"><<a href="mailto:silent_vendetta@hotmail.com" target="_blank">silent_vendetta@hotmail.com</a>></span> wrote:<br><blockquote style="border-left:1px #ccc solid;padding-left:1ex">





<div><div dir="ltr">
Quick question, what would be considered the easiest way to "return" data to a running Erlang application from an escript? For example I might want to run an escript with a data structure I want it to modify and, once it is all done, get the modified structure back.                                      </div>

</div>
<br>_______________________________________________<br>
erlang-questions mailing list<br>
<a href="mailto:erlang-questions@erlang.org" target="_blank">erlang-questions@erlang.org</a><br>
<a href="http://erlang.org/mailman/listinfo/erlang-questions" target="_blank">http://erlang.org/mailman/listinfo/erlang-questions</a><br>
<br></blockquote></div><br></div></div></div>                                           </div>
<br></div>_______________________________________________
erlang-questions mailing list
<a href="mailto:erlang-questions@erlang.org" target="_blank">erlang-questions@erlang.org</a>
<a href="http://erlang.org/mailman/listinfo/erlang-questions" target="_blank">http://erlang.org/mailman/listinfo/erlang-questions</a></div></div>                                     </div></div>
<br>_______________________________________________<br>
erlang-questions mailing list<br>
<a href="mailto:erlang-questions@erlang.org">erlang-questions@erlang.org</a><br>
<a href="http://erlang.org/mailman/listinfo/erlang-questions" target="_blank">http://erlang.org/mailman/listinfo/erlang-questions</a><br>
<br></blockquote></div><br>