Cheers!
sâmbătă, 23 ianuarie 2016, 19:01:24 UTC+1, Stefan Karpinski a scris: > > Great! I'm glad you got it sorted out. > > On Fri, Jan 22, 2016 at 6:24 PM, Adrian Salceanu <adrian....@gmail.com > <javascript:>> wrote: > >> No no, It's perfectly fine, it was my fault. What I haven't realized is >> that if I start the server async then my script will finish immediately, >> which also terminated the server. It was my responsibility to keep the >> whole app alive now. >> >> It works like a charm! >> >> >> sâmbătă, 23 ianuarie 2016, 00:06:13 UTC+1, Stefan Karpinski a scris: >>> >>> The shell works with processes, Julia has tasks where are not the same >>> thing... >>> >>> On Fri, Jan 22, 2016 at 5:49 PM, Adrian Salceanu <adrian....@gmail.com> >>> wrote: >>> >>>> The problem seems to that HttpServer can not run @async - it exits >>>> immediately. >>>> >>>> === >>>> >>>> using HttpServer >>>> >>>> http = HttpHandler() do req::Request, res::Response >>>> Response( ismatch(r"^/hello/", req.resource) ? exit(2) : 404 ) >>>> end >>>> >>>> server = Server( http ) >>>> run( server, 8001 ) # <--- this works but blocks >>>> @async run( server, 8001 ) # <--- this exits immediately >>>> >>>> === >>>> >>>> It's not necessarily a problem that HttpServer blocks. But what drives >>>> me nuts is: if I run >>>> $ julia app.jl & >>>> in the shell, it works perfectly. The process is placed in the >>>> background, the server happily listens to the assigned port, etc. >>>> >>>> Why can't I run the same command from within another julia process and >>>> get the same effect? >>>> >>>> >>>> vineri, 22 ianuarie 2016, 22:40:56 UTC+1, Stefan Karpinski a scris: >>>>> >>>>> @spawn runs a command on a (random) worker process. If you want to do >>>>> "background" work in the current process, you can use @async: >>>>> >>>>> julia> t = @async (sleep(5); rand()) >>>>> Task (runnable) @0x0000000112d746a0 >>>>> >>>>> julia> wait(t) >>>>> 0.14543742643271207 >>>>> >>>>> >>>>> On Fri, Jan 22, 2016 at 4:33 PM, Adrian Salceanu <adrian....@gmail.com >>>>> > wrote: >>>>> >>>>>> Oh! The ruby analogy made me think about actually spawning the >>>>>> detached command! Which produced the desired effect! >>>>>> >>>>>> julia> @spawn run(detach(`ping www.google.com`)) >>>>>> >>>>>> >>>>>> >>>>>> vineri, 22 ianuarie 2016, 22:29:27 UTC+1, Adrian Salceanu a scris: >>>>>>> >>>>>>> I guess what I'm looking for is the equivalent of Ruby's >>>>>>> Process#spawn >>>>>>> >>>>>>> In REPL: >>>>>>> >>>>>>> >> pid = Process.spawn("ping www.google.com", :out => '/dev/null') >>>>>>> 83210 >>>>>>> >> <-- the process is running in the >>>>>>> background and control has been returned to the REPL >>>>>>> >>>>>>> >>>>>>> vineri, 22 ianuarie 2016, 22:06:01 UTC+1, Adrian Salceanu a scris: >>>>>>>> >>>>>>>> Hi, >>>>>>>> >>>>>>>> I'm hammering at a web app and I'm trying to setup functionality to >>>>>>>> monitor the file system for changes and restart/reload the server >>>>>>>> automatically so the changes are picked up (I'm using Mux which uses >>>>>>>> HttpServer). >>>>>>>> >>>>>>>> The approach I have in mind is: >>>>>>>> >>>>>>>> 1. have a startup script which is run from the command line, >>>>>>>> something like: >>>>>>>> $ julia -L startup.jl >>>>>>>> >>>>>>>> 2. the startup script launches the web app, which starts the web >>>>>>>> server. My intention was to run >>>>>>>> $ julia -L app.jl >>>>>>>> as a command inside startup.jl, detached, and have the startup.jl >>>>>>>> script get back control, with app.jl running detached in the >>>>>>>> background. >>>>>>>> >>>>>>>> 3. once startup.jl gets back control, it begins monitoring the file >>>>>>>> system and when changes are detected, kills the app and relaunches it. >>>>>>>> >>>>>>>> That was the theory. Now, I might be missing something but I can't >>>>>>>> find a way to detach the command I'm running and get control back to >>>>>>>> the >>>>>>>> startup script. And I tried a lot of things! >>>>>>>> >>>>>>>> === >>>>>>>> >>>>>>>> I'm providing simpler example using "ping", which also run >>>>>>>> indefinitely, similar to the web server. >>>>>>>> >>>>>>>> julia> run(detach(`ping "www.google.com"`)) # the command is >>>>>>>> detached and continues to run after the julia REPL is closed, but at >>>>>>>> this >>>>>>>> point the REPL does not get control, there's no cursor available in >>>>>>>> the REPL >>>>>>>> PING www.google.com (173.194.45.82): 56 data bytes >>>>>>>> 64 bytes from 173.194.45.82: icmp_seq=0 ttl=54 time=30.138 ms >>>>>>>> 64 bytes from 173.194.45.82: icmp_seq=1 ttl=54 time=30.417 ms >>>>>>>> ... more output ... >>>>>>>> 64 bytes from 173.194.45.82: icmp_seq=7 ttl=54 time=30.486 ms >>>>>>>> 64 bytes from 173.194.45.82: icmp_seq=8 ttl=54 time=30.173 ms >>>>>>>> ^CERROR: InterruptException: >>>>>>>> <---- here I press Ctrl+C and only now the >>>>>>>> REPL >>>>>>>> gets back the cursor, with the command still running in the background >>>>>>>> >>>>>>>> === >>>>>>>> >>>>>>>> Also, related to this, passing "&" into the command to detach does >>>>>>>> not work as expected, the "&" is interpreted as argument of the >>>>>>>> command. >>>>>>>> Not sure if this would help anyway to return control to the startup.jl >>>>>>>> script? >>>>>>>> >>>>>>>> julia> run(detach(`ping "www.google.com" &`)); >>>>>>>> usage: ping [-AaDdfnoQqRrv] [-b boundif] [-c count] [-G >>>>>>>> sweepmaxsize] >>>>>>>> [-g sweepminsize] [-h sweepincrsize] [-i wait] [−k >>>>>>>> trafficclass] >>>>>>>> [-l preload] [-M mask | time] [-m ttl] [-p pattern] >>>>>>>> [-S src_addr] [-s packetsize] [-t timeout][-W waittime] >>>>>>>> [-z tos] >>>>>>>> host >>>>>>>> ping [-AaDdfLnoQqRrv] [-b boundif] [-c count] [-I iface] [-i >>>>>>>> wait] >>>>>>>> [−k trafficclass] [-l preload] [-M mask | time] [-m >>>>>>>> ttl] [-p pattern] [-S src_addr] >>>>>>>> [-s packetsize] [-T ttl] [-t timeout] [-W waittime] >>>>>>>> [-z tos] mcast-group >>>>>>>> ERROR: failed process: Process(`ping www.google.com &`, >>>>>>>> ProcessExited(64)) [64] >>>>>>>> in run at /usr/local/Cellar/julia/0.4.2/lib/julia/sys.dylib >>>>>>>> >>>>>>>> === >>>>>>>> >>>>>>>> Thanks >>>>>>>> >>>>>>> >>>>> >>> >