2011-02-07 13 views
8

Come avviare un daemon di shell e quindi interromperlo dallo stesso script Ruby?Come avviare e arrestare un daemon di shell da Ruby

Per essere più precisi, vorrei il mio script Ruby per:

  • avviare un demone server con un comando di shell (rails server | shotgun | ecc ...).
  • fare un paio di cose mentre il server è in esecuzione.
  • fa chiudere il server.

Tutte le soluzioni avvolgenti supportate in ruby ​​1.8/1.9 e unix/windows sono preferite. (Ho letto fork per esempio non funziona su Windows).

+0

Non sono sicuro che la tua ipotesi che Kernel :: fork non funzioni su Windows sia corretta. Passerei un po 'di tempo a sperimentare con Kernel :: exec, Kernel :: fork, Kernel :: system e vedere come si comportano per te. –

+0

Giordania, io non uso Windows. Mi sono imbattuto in diverse menzioni di fork che non si comportavano come previsto su Windows (come qui: http://www.ruby-forum.com/topic/215939). –

risposta

3

Consiglio vivamente lo Ruby Daemons gem. Penso che abbia tutte le funzionalità di cui hai bisogno.

Controllare la sezione 3 del relativo README e prestare particolare attenzione al metodo Daemons.call che consente di eseguire il daemonize del codice arbitrario (in cui è possibile solo Kernel.system un'app).

+0

@Pavel: erm, si, la sezione 3 dei documenti: "Controlla un mucchio di demoni da un'altra applicazione" ... Sì, è in parte per il daemonizzazione, ma anche per demonizzare altre app! – Peter

0

Ecco problema simile con la soluzione che utilizza Windows da riga di comando di lavoro:

https://serverfault.com/questions/35305/cmd-exe-how-to-starts-a-background-process-run-some-things-stops-background-pr

Questo è abbastanza sporca, ma lo fa il trucco.

Utilizzare Linux se è possibile o semplicemente bash con gli strumenti di base della riga di comando (installati con Git per Windows). Con bash, la soluzione è molto semplice:

./script/rails server --pid server.pid & 
ruby do_your_stuff.rb 
kill `cat server.pid` 

P.S. Windows non è comunque un ambiente consigliato per Rails. Probabilmente, a lungo termine, risparmierai molto tempo passando a Linux, perché non risolverei problemi ambientali come questo.

0

io non riuscivo a capire come fare quello che mi serviva con la gemma rubino Demoni Peter ha suggerito, e finito per usare systemu invece:

# command to start daemon 
command = "thin start" # here starting thin server as example 
status, stdout, stderr = systemu command do |cid| 
    # do stuff here 
    # ... 

    Process.kill 9, cid # kill the daemon 
end 
+0

Per utilizzare la gemma Daemon con Rails è necessario utilizzare il plugin daemon_generator. http://douglasfshearer.com/blog/cron-jobs-in-ruby-on-rails –

+0

Grazie, ma non sto usando Rails. –

Problemi correlati