Hay un servidor al que tengo acceso, pero no tengo propiedad. Sirve una aplicación node js / express en un puerto predeterminado 3000. Hay varios scripts, que generalmente se ejecutan manualmente desde la terminal o mediante un trabajo cron. Lo que quiero hacer es tener un botón en el lado del cliente y hacer una solicitud ajax a una determinada ruta y ejecutar un comando de nodo js con argumentos en línea. Por ejemplo:
node script.js 123
Todas las rutas están configuradas y funcionando. Tengo un archivo CliController que maneja solicitudes y tiene que ejecutar el comando anterior. Actualmente estoy usando el siguiente código:
cp.exec(`node script.js ${ip}`, function (err, stdout, stderr) { if (err) { console.log(err); } console.log(stdout); console.log(stderr); }); El archivo script.js está en la carpeta raíz del proyecto, pero el proyecto en sí se creó con express-generator y se sirve con el comando node bin/www . Hay un servicio/proceso en el servidor que ejecuta nodemon para reiniciar este proyecto si también falla. Por lo tanto, no tengo acceso a la salida de ese proceso en particular.
Si ejecuto el comando anterior en la terminal (desde la carpeta raíz del proyecto, para ser precisos), funciona bien y veo el resultado del script. Pero si presiono el botón en la página web para realizar una solicitud, estoy bastante seguro de que el script no se ejecuta, porque tiene que actualizar la base de datos y no veo ningún cambio. También traté de usar child_process.spawn y child_process.fork y no pude hacerlo funcionar.
También traté de matar a nodemon y rápidamente volví a iniciar el proyecto en la salida de la consola de visualización. Si hago esto, todo funciona.
Qué estoy haciendo mal ?
El proceso invocado puede estar en un estado de bloqueo, por lo tanto, el script principal simplemente está esperando que el proceso secundario finalice o devuelva algo.
Podemos evitar este comportamiento directamente en el comando de shell, agregando & (operador de control de ampersand) al final.
Esto hace que un comando se ejecute en segundo plano. (Aviso, aún puede controlar el proceso de los niños usando las señales PID y POSIX , este es otro tema , pero muy relacionado y puede que lo encuentre muy útil muy pronto).
También tenga en cuenta que matar/detener el script principal también matará a los hijos. Esto se puede evitar usando nohup .
Esto no está vinculado a JavaScript o node.js, sino a bash , y se puede usar con cualquier cosa en el shell.
cp.exec(`node script.js ${ip} &`, function (err, stdout, stderr) { if (err) { console.log(err); } console.log(stdout); console.log(stderr); });