¿Alguien puede decirme cómo olvidar y disparar un proceso en Perl? Ya he consultado ruby: how to fire and forget a subprocess? para hacer lo mismo en Ruby.¿Cómo puedo disparar y olvidar un proceso en Perl?
Respuesta
De respuesta perlfaq8 's a How do I start a process in the background?
Varios módulos pueden iniciar otros procesos que no bloquean su programa Perl . Puede utilizar IPC :: Open3, Parallel :: Jobs, IPC :: Run y algunos de los módulos POE. Ver CPAN para más detalles.
También es posible usar
system("cmd &")
o puede utilizar tenedor como se documenta en "tenedor" en perlfunc, con más ejemplos en perlipc. Algunas cosas a tener en cuenta, si estás en un Unix como sistema de :
stdin, stdout y stderr son compartidos
Tanto el proceso principal y la backgrounded (el "niño" proceso) comparten los mismos manejadores de archivo STDIN, STDOUT y STDERR. Si ambos intentan acceder a ellos de una vez, pueden suceder cosas extrañas. Usted puede querer cerrar o volver a abrir estos para el niño. Puede obtener alrededor de esto con "abrir" una tubería (ver "abrir" en perlfunc) pero en algunos sistemas significa que el proceso hijo no puede sobrevivir al padre .
señales
Vas a tener que coger la señal SIGCHLD, y posiblemente SIGPIPE también. SIGCHLD se envía cuando finaliza el proceso de fondo. SIGPIPE es enviado cuando escribe en un identificador de archivo cuyo proceso hijo ha cerrado (un SIGPIPE no capturado puede hacer que su programa muera en silencio). Esto no es un problema con "system (" cmd & ")".
Zombies
Usted tiene que estar preparado para "cosechar" el proceso hijo cuando acabados.
$SIG{CHLD} = sub { wait };
$SIG{CHLD} = 'IGNORE';
También puede usar una horquilla doble. Inmediatamente esperas() para tu primer hijo , y el daemon init esperará() para tu nieto una vez que salga.
unless ($pid = fork) {
unless (fork) {
exec "what you really wanna do";
die "exec failed!";
}
exit 0;
}
waitpid($pid, 0);
Ver "Señales" en perlipc para otros ejemplos de código para hacer esto. Los zombis no son un problema con "system (" prog & ")".
Si quiere demonizar su script Perl que había mirar en Proc::Daemon.
En realidad, no quiero demonizarlo, solo tengo que ejecutar un script de vigilancia en el fondo mientras dure la ejecución de mi script principal. Y solo tengo Perl 5.6.0 básico para trabajar, porque esto se está ejecutando en un sistema integrado con una memoria muy limitada y prácticamente no tengo módulos con los que trabajar. –
bien no se debe utilizar como system()
entiendo esta llamada esperará a que el retorno de la función antes de continuar con la ejecución. Simplemente me limitaría a linux e iniciaría el proceso de esa manera, aunque tenga en cuenta que de esta manera se enviará una nueva copia del intérprete de comandos y, por lo tanto, si está buscando rendimiento, no lo haría en un ciclo:
process_name > /dev/null 2>&1 &
;
que se iniciará el proceso de reorientación y STDOUT
STDERR
-/dev/null.
Si desea que el proceso "secundario" del perro guardián desaparezca cuando finaliza el proceso "principal", no desea realmente que el proceso principal "active y olvide" el proceso hijo. O bien debe bifurcar (como lo describe el brian d foy) o pasar el PID del padre al hijo (para que este último pueda sondear la tabla de proceso, no recomendado).
En realidad, ejecutar una secuencia de comandos de vigilancia como un proceso secundario probablemente sea una mala idea ya que se supone que el perro guardián debe hacer algo si la secuencia de comandos principal muere inesperadamente (pero si el padre muere también lo hacen todos sus hijos). Otra forma de hacerlo es hacer que el "proceso principal" configure un conducto con nombre y escribir mensajes de "latido" + un mensaje de "finalización" al salir, mientras que el perro guardián (lanzado en modo verdadero "disparar y olvidarse" system ("cmd &")) lee desde la tubería con nombre y avisos cuando llega el mensaje "listo" o dejan de aparecer los mensajes de "latido". – Peter
- 1. ¿Cómo disparar y olvidar un subproceso?
- 2. ¿Cómo puedo 'disparar y olvidar' una función JS? (no espere el regreso)
- 3. En Perl, ¿cómo proceso un hash completo?
- 4. ¿Cómo puedo adjuntar un depurador a un proceso Perl en ejecución?
- 5. ¿Cómo se inicia un proceso en segundo plano en Perl?
- 6. ¿Cómo puedo disparar un escáner desde un navegador?
- 7. perl cola de proceso
- 8. Cómo disparar un evento personal en Javascript
- 9. ¿Cómo puedo serializar un cierre en Perl?
- 10. ¿Cómo puedo deshacer un objeto en Perl?
- 11. ¿Cómo puedo obtener un rastreo en Perl?
- 12. ¿Cómo puedo cancelar y reiniciar correctamente un proceso de BackgroundWorker?
- 13. ¿Cómo puedo depurar un script de Perl?
- 14. ¿Cómo olvidar una red inalámbrica en Android programáticamente?
- 15. ¿Cómo puedo leer y manipular archivos PDF 1.5 en Perl?
- 16. ¿Cómo, en Perl 5, puedo obtener el pid del proceso que me envió una señal?
- 17. He comenzado un proceso, ¿cómo puedo llamar a un método en ese proceso?
- 18. ¿Cómo puedo convertir un número en texto en Perl?
- 19. ¿Cómo puedo codificar una fábrica en Perl y Moose?
- 20. ¿Cómo puedo convertir entre notación científica y decimal en Perl?
- 21. ¿Cómo puedo identificar y eliminar código redundante en Perl?
- 22. Cómo olvidar todos los archivos eliminados con Mercurial
- 23. ¿Cómo puedo matar un árbol de procesos completo con Perl?
- 24. ¿Cómo puedo convertir una cadena en un número en Perl?
- 25. ¿Cómo puedo definir constantes en un archivo separado en Perl?
- 26. ¿Cómo puedo combinar varios hashes en un hash en Perl?
- 27. ¿Cómo puedo recorrer archivos en un directorio en Perl?
- 28. ¿Cómo puedo ejecutar un comando externo de Windows y regresar instantáneamente en Perl?
- 29. ¿Cómo puedo bifurcar un proceso en segundo plano desde una secuencia de comandos Perl CGI en Windows?
- 30. Disparar un evento de teclado en Chrome
Muchas gracias, no había pensado utilizar el operador de shell de fondo en el comando. Eso hizo el truco. Desafortunadamente no puedo usar los demás porque estoy trabajando en un sistema severamente limitado con casi ningún módulo. –
Ah, sí, si emite un comando system() con '&' char, vuelve enseguida, por lo que el método del operador back-tick que había sugerido no era tan bueno; mejor usar la llamada al sistema de Perl en lugar de llamar a un todo nueva copia del caparazón. –