/ / ¿Cómo puedo manejar una llamada al `sistema` que falla? - windows, perl, manejo de errores, externo

¿Cómo puedo manejar una llamada al `sistema` que falla? - Windows, Perl, manejo de errores, externo.

Tengo un script en Perl que llama a un programa externo. (En este momento estoy usando comillas invertidas, pero podría usar con la misma facilidad system o algo de cpan.) A veces el programa falla, lo que hace que Windows cree un cuadro de diálogo "(programa externo) ha dejado de funcionar" con el texto

Windows está buscando una solución al problema ...

pronto reemplazado con

Un problema causó que el programa no funcionara correctamente. Windows cerrará el programa y le notificará si hay una solución disponible.

Desafortunadamente, este mensaje de error evita que el proceso muera, lo que hace que Perl no regrese hasta que el usuario (¡yo!) Haga clic en "Cancelar" o "Cerrar programa". ¿Hay alguna forma de evitar este comportamiento?

En mi caso de uso, es aceptable que el programa falle; hace un trabajo útil pero estrictamente no necesario. Pero como necesita ejecutarse sin supervisión, no puedo permitir que bloquee el trabajo restante del programa.

Respuestas

3 para la respuesta № 1

El problema con su enfoque actual es que las comillas inversas y system bloquear mientras el programa externo se está ejecutando / colgando. Otros posibles enfoques podrían incluir.

  • Usando hilos y varios módulos del Win32 familia ocupada, espere a que finalice el proceso o haga clic en el cuadro de marcado. Probablemente sea una exageración.
  • Utilice una señal de alarma o un evento para activar su programa cuando el programa externo haya tardado "demasiado" en responder.
  • Utilice un módulo de IPC para abrir el programa y controlar su progreso.
  • Si no necesita el valor de retorno del programa hijo, STDOUT o STDERR, simbabque "s exec La opción tiene mérito, pero si necesita controlar el proceso, intente Win32::Process. He encontrado esto útil en muchas ocasiones. El módulo wait El método puede ser una excelente alternativa a mi sugerencia de alarma o sugerencia de sueño de simabque con el beneficio adicional de que su programa no dormirá más de lo requerido por el niño.

0 para la respuesta № 2

Si no necesita esperar a que el programa externo termine de ejecutarse para continuar, puede hacer exec en lugar de system y nunca volverá.

Siempre puedes agregar un sleep $n luego para que espere a que el programa externo termine teóricamente.

exec("maybe_dies.exe");
sleep 1; # make sure it does stuff before it dies, or not, or whatever...