2011-12-23 16 views
14

Ho un file JS che viene eseguito tramite node.js, quindi normalmente apro una finestra di terminale e digito qualcosa come node myfile.js e viene eseguito e viene eseguito tutto il giorno; divertimento.nodo trigger js file

Quindi quando voglio riavviarlo, premo control-c e si chiude. Quindi posso eseguire nuovamente il comando.

Ora quello che mi piacerebbe fare è essere in grado di farlo attraverso una pagina Web in modo che i miei utenti possano eseguire specifici file JS e anche essere in grado di "riavviarli".

Quindi due domande su questo:

  1. è possibile, e se sì, come faccio a iniziare?
  2. È sicuro, e in caso contrario, può essere reso sicuro?

Sulla base swatkins risposta

Ho provato questo e non ha ottenuto nulla

$output = exec("node -v"); 
echo $output; 

Poi ho provato sulla mia macchina locale e ha funzionato bene ciò che dà?

anche io non sono ancora sicuro circa la sicurezza e la capacità di fermare uno script in esecuzione

+0

No, '$ output' deve essere passato come secondo parametro della funzione exec:' exec ("node -v", $ output); print_r ($ output); ' – swatkins

risposta

16

Supponendo che siete su OS basato su Unix:

È possibile eseguire comandi di shell tramite l'exec() funzione:

// in php file 
// to start the script 
exec("node myscript.js &", $output); 

$output diventa una matrice di ciascuna linea di uscita, in modo da poter vedere ciò che l'identificativo è. Quindi useresti quell'ID di processo per uccidere lo script:

exec("kill " . $processid); 
+0

e come potrei quindi interrompere quello script? ed è sicuro farlo funzionare? anche come faccio a sapere se è in esecuzione? – mcgrailm

+0

ha aggiornato la mia risposta: è necessario ottenere l'id di processo, quindi eseguendo 'myscript.js' in background (aggiungendo' & 'al comando), si riceverà un id di processo nell'array di output. Probabilmente avrai bisogno di manipolare le stringhe per ottenere l'id effettivo, ma poi lo userai per uccidere il processo. – swatkins

+0

questo esegue lo script ma non mi fornisce alcun output fino a quando non uccido il processo e quindi mi fornisce i dati scritti in console.log() – mcgrailm

2

Eviterei qualsiasi interazione diretta con la shell. Probabilmente sarebbe il più sicuro, per risolvere in questo modo:

  • attuare alcune -script complessiva "servizio", che lancia l'utente-node-app e la mantiene in esecuzione (qualcosa come https://github.com/isaacs/node-supervisor)
  • Make it , quindi si riavvia automaticamente alle modifiche dei file rilevanti o di una voce del database
  • Con l'utente che attiva un riavvio, aggiungere un flag (timestamp?) alla voce del database o al file che viene guardato dallo script di riavvio. Quindi riavvierà node.js-app/script.
+3

Perché non avresti l'interazione della shell? Cosa c'è di sbagliato nella risposta accettata? –