Procesos hijo
Clase 15 de 31 • Curso de Fundamentos de Node.js
Contenido del curso
Clase 15 de 31 • Curso de Fundamentos de Node.js
Contenido del curso
Jesús Miguel Quinto Teran
Jimmy Buriticá Londoño
Reinaldo Mendoza
Lery Andy Piérola Lazarte
Roberto Shirásago Domínguez
Sergio Martínez Cuevas
Luis Lazcano
Adriana Gómez Hinojosa
Anfernee Valera
Juan Esteban Deossa Pertuz
Jose Jimenez
Jorge Carrion
Jimmy Buriticá Londoño
Roberto Pérez Favela
Johan Manuel Perez Soto
Jesús Miguel Quinto Teran
Cristobal Vega
María Sierra
Francisco Garcia [C6]
Nahuel Olivera
Carlos Arturo Rueda Calier
Jose Daniel Molina
Platzi Team
ANDREA PAZ TAPIA MENESES
Robinson Matias Aguilar Bascuñan
Cristian Bonomo
Massimo Di Berardino
Vicente Daniel Zurita Salas
Edwin Ivan Ortiz Zelada
César Palma
Romel Javier Gomez Herrera
Carlos Nassif Trejo Garcia
Cristian Córdova
David Cruz Portilla
Raymond Alexander Mansell Muñoz
Jossie Steeven Quintero Giron
David Antonio Garcia Saaib
Juan Carlos Valencia López
Alexander Nova Arevalo
Abigail Perez
Carlos Enrique Ramírez Flores
Child Process
En node podemos crear procesos hijos que ejecuten cualquier accion de nuestro sistema operativo, como si nos encontraramos en la linea de comandos.
Podemos llamar a exec para ejecuciones sencillas:
const { exec } = require('child_process') exec('ls', (e, stdout) => { (e) ? console.log(e) : console.log(stdout) })
Podemos llamar a spawn para obtener el proceso: La ventaja de este enfoque es que obtienes mayor control del proceso, y del estado en el que se encuenta
const { spawn } = require('child_process') const myprocess = spawn('ls') process.stdout.on("data", data => console.log(data.toString())); process.on("exit", () => console.log("process end"));
Gracias por la explicación.
Muchas gracias
con eso funciona en Windows
let proceso = spawn('cmd.exe', ['/c','dir']);```
en el mio no hace nada, quien sabe que es
Rob, incluye la función .stdout.on para ver la salida estándar del comando
let proceso = spawn('cmd.exe', ['/c','dir']); proceso.stdout.on('data', function(dato){ console.log(dato.toString()); })```
Funcionamiento de los child process Un proceso es la ejecución de algo(programa, commando, etc) que terminara en un tiempo finito.
Cuando se ejecuta un programa estos corren sobre la terminal y cuando necesitan crear un nuevo proceso crean una nueva terminal(Parent shell).
Entonces al utilizar esto creamos un Chils shell que ejecutara cualquiere instrucción que le pasemos. Para corroborar esto podemos ejecutar.
const {exec, spawn} = require('child_process'); exec('ps -f',(err,stdout,stderr)=>{ if(err){ console.log('Tuvimos un error') return false } console.log(stdout) })
Y nos mostrará algo así donde PID es Proces IDse liga con Process Parent ID.
En conclusión el módulo de Node funciona a nivel SO creando child shell en los que es posible ejecutar cualquier instrucción, programa, etc, cualquier instrucción que nuestro terminal ya posea.
Excelente aporte, gracias por compartir
Me ayudó a solventar unas dudas, gracias.
Node nos permite ejecutar varios hilos de procesos desde el suyo propio, sin importar de que sea este proceso, es decir, puede ejecutar procesos de Python, otros procesos de Node u otro proceso que tengamos en nuestro sistema. Para poder usar estos procesos usamos el modulo de child-process, este trae dos métodos que nos permitirá ejecutar los procesos que deseemos. El método exec y el método spawn. El método exec nos permite ejecutar un comando en nuestro sistema, recibe como parametros el comando entero que deseemos y como segundo parámetro un callback con tres parámetros, un error, un stdout y un stderr. El método spawn es parecido al método exec pero un poco más complejo, permitiéndonos conocer su estado y que datos procesa en cada momento del estado de comando ejecutado.
Buena!
Mi código para hacer ping usando child_process
const { exec } = require("child_process"); const ip = "8.8.8.8"; const ping = (address) => { return new Promise((resolve, reject) => { exec(`ping ${address}`, (error, stdout, stderr) => { if (error) { reject(error); } else { resolve(stdout); } }); }); }; ping(ip) .then((result) => console.log(result)) .catch((error) => console.error("Ocurrió un error: ", error.message));
Genial
wow, muy bien ordenado.
Ahhhhhhhhhhh Node es un amor ❤❤, no tenia ni idea de que hacer algo como eso fuera tan sencillo!
#HailNodeJs ✋✋
Es realmente muy elegante!
Y eso que es nodejs sin nada. Solo con las librerías nativas. :astonished:
Procesos hijo
Un proceso es algo que se ejecuta y termina de ejecutarse. Con child process podremos acceder a la terminal por medio de Node.js
const { exec } = require('child_process') let processes = [ 'ls -la', 'node consola.js' ] exec(processes[1], (err, stdout, sterr) => { if (err) { console.error(err) return false } console.log(stdout) })
También podemos ver a detalle cómo se maneja un proceso con el método spawn
const { exec, spawn } = require('child_process') let processSpawn = spawn('ls', ['-la']) console.log(processSpawn.pid) console.log(processSpawn.connected) processSpawn.stdout.on('data', (datos) => { console.log('¿Está muerto?') console.log(process.killed) console.log(datos.toString()) } ) processSpawn.on('exit', () => { console.log('El proceso termino') console.log(processSpawn.killed) } )
let proceso = spawn('cmd.exe', ['/c', 'dir']); console.log(proceso.pid); console.log(proceso.connected); proceso.stdout.on('data', (dato) => { console.log('esta muerto el proceso???') console.log(proceso.killed); console.log(dato.toString()); }) proceso.on('exit', () => { console.log('el proceso termino'); console.log('ahora si esta muerto el proceso???') console.log(proceso.killed); })
Hola Francisco ! cómo va ? De dónde sacaste lo del CMD ?... porque intentaba haciendo DIR dentro del Spawn y no me funcionaba.
cmd hace referencia a la consola de windows la de símbolos del sistema y lo que pide el es que la ejecute para que pueda leer el comando dir
Esto es muy potente!! Creo que incluso se pueden ejecutar otros programas, y puede ser muy util, tal vez para abrir un cliente de correo electronico, ejecutar una pista de audio etc...
Estuve intentando y con esta linea, puedes ejecutar google chrome
exec('start chrome');
Genial 🔥
Está super genial eso, y si pones sólo
exec('start');
abre el cmd
esto llevándolo a un contexto real, para que podría servir ?
Te doy un ejemplo de algo que hice, que fue inicializar git con el comando git init, aprovechando un proceso hijo. No se si se utiliza en produccion, pero me parece interesante escribir una funcion que revise si tu repositorio esta inicializado, y si no es asi, lo pueda inicializar sin tener que frenar la ejecucion.
¡Hola @ZeroData! Te doy un ejemplo de como podrías utilizarlo, digamos que tienes un servicio web que procesa pagos y mientras estás procesando un pago, quieres en un proceso hijo ir a la base de datos registrar la transacción, resta la cantidad de artículos del stock y todo esto mientras en el proceso principal estás validando el pago de la tarjeta. Esto agilizaría la transacción y tendrías un software con mejor performance
Para windows se hace diferente, ya que dir no es un ejecutable.
a mi si me funciono con dir:
exec('dir', (err, stdout, sterr) => { if (err) { console.log(err); return false; } console.log(stdout) })
exec si funciona solo con dir, spawn no
const { exec, spawn } = require("child_process"); exec("ls -ls", (err, stdout) => { console.log("\nExec example:\n"); if (err) { console.log(err); return false; } console.log(stdout); }); let process = spawn("ls", ["-la"]); process.stdout.on("data", data => console.log(data.toString())); process.on("exit", () => console.log("process end; process.killed:", process.killed) );
En la parte final de si el proceso termino, le sale ++undefined++ porque escribio "process" cuando debio de haber sido como "proceso".
const { exec, spawn } = require('child_process'); /*exec('dir', (err, stdout, sterr) => { if(err) { console.error(err); return false; } console.log(stdout); }) */ let proceso = spawn('cmd.exe', ['/c','dir']); console.log(proceso.pid); console.log(proceso.connected); proceso.stdout.on('data', function(dato){ console.log('Esta muerto?', proceso.killed); console.log(dato.toString()); }) proceso.on('exit', function() { console.log('el proceso termino'); })
Ese exec me ha recordado al -exec que tiene el comando find. Obviamente este exec de node es mucho más complejo pero la teoría es parecida
Una pregunta, cuando trae el modulo 'child_process', también se puede traer como:
import { exec } from 'child_process';
o eso del import solo es para cuando estamos trabajando en el navegador? cual es la diferencia entre el import y con el require?
Node utiliza por defecto la sintaxis de CommonJS para trabajar con módulos (require/module/exports).
Sin embargo desde la versión 12 de Node es posible habilitar la sintaxis de ECMAScript (import/export). Para esto debes incluir la propiedad "type": "module" en el package.json más cercano. Sobre las diferencias, la más importante es que ya no tendrás acceso a las variables __filename y __dirname en caso de que estés trabajando con rutas relativas con el módulo fs. Por último,
con import no puedes traer archivos con extensión .json. Por lo demás, todo funciona igual.
En esta clase se demuestra que no solo es programar, si no conocer la computación en general, como funciona un sistema operativo, una red, etc
//cuando corre el proceso la data que obtenga la vamos a mostrar proceso.stdout.on('data', function(data) { //mediante la varaible proceso podemos acceder a sus metodos console.log('Process is killed?:', proceso.killed) console.log(data.toString()) //imprime la data }) // justo es la ultima linea del proceso, al ejecutarse se imprime proceso.on('exit', () => { console.log('El proceso terminó!') //avisa que el proceso termino console.log('Process is killed?:', proceso.killed) //pero aun no muere })
Ahora funciona ls en Windows
No en el CMD,
Child process: devuelve un lista de objetos entre los cuales esta exec
exec: recibe el comando a ejecutar en el sistema operativo, recibe un callback
Un proceso hijo puede ejecutar un proceso de node, esto permite seguie haciando cosas por debajo usando node
HE aquí mi código!!
const { exec, spawn } = require('child_process'); /*exec('ls ', (error, stdOut) => { error ? console.log(error) : console.log(stdOut); }); */ let proceso = spawn('ls',['-la']); console.log(proceso.pid); console.log(proceso.connected); proceso.stdout.on('data', (dato) => console.log(dato.toString())) proceso.on('exit', () => console.log('Proceso terminado'))```