¿Cómo evitar que la aplicación lanzada en Terminal se cierre indeseablemente?

Lanzo aplicaciones desde la Terminal con comandos como este:

/Applications/Mail.app/Contents/MacOS/Mail &

La parte importante es la  &.

  • Para Unix/Linux/Solaris:

    • Aprendí en la escuela que agregar el  &hace que el programa viva por sí solo.
    • Recuerdo mucho haber lanzado un comando como  xeyes &y tener el programa funcionando de manera segura incluso después de cerrar el shell.
  • En Mac OS X (Unix dentro):

    1. Lanzo una aplicación con  &y cierro la ventana de Terminal: ¡la aplicación sale!
    2. ¿Por qué ocurre este comportamiento indeseable en Mac OS X?
    3. Cómo se puede arreglar esto ?

Respuestas (7)

La forma "estándar" de lograr lo que desea lograr (tanto en OS X como en Linux, FreeBSD u otros sistemas) es usar el comando nohup:

nohup program &

Esto comenzará program, que se ejecutará en segundo plano en relación con el shell debido a &- e ignorará las señales de colgado debido al comando nohup.

De esta manera, el programa continuará ejecutándose aunque cierre el shell. No importa si está cerrando el shell porque está cerrando Terminal.app, o si está cerrando el shell porque se está desconectando de una conexión ssh a la computadora, o similar.

Esto crea un archivo nohup.outen la carpeta actual. Incluso cuando no hay nada que escribir. Después de algunas semanas, tendría archivos nohup.outpor todas partes en mi Mac. :-(
@NicolasBarbulesco Usa nohup command>/dev/null&o command&disown.

Cuando cierra una ventana de terminal, envía un SIGHUP (señal de colgar) al shell, que luego envía SIGHUP a todos los procesos que inició . Este es el comportamiento tradicional de bash y muchos otros shells, y la solución tradicional a esto es usar nohup.

Hay formas en que las diferentes máquinas Unix pueden diferir, por lo que es posible que los emuladores de terminal específicos que usó o los shells específicos que usó se comportaron de manera diferente. Pero no es específico de OS X. Por ejemplo, hay una pregunta sobre este mismo problema en Ubuntu.

Usando el signo " &", le está diciendo a la Terminal que ejecute el proceso en segundo plano del propio shell. Por lo tanto, cuando cierre el shell (y elimine el proceso), la GUI (Mail.app en sí) también se cerrará.

El comando correcto para iniciar Mail desde la terminal es simplemente:

open -a Mail; exit

Editar: Acabo de encontrar esto en U&L Stack Exchange: ¿Qué significa ampersand al final de una línea de script de Shell? ¡Las respuestas proporcionadas son excelentes y explican exactamente lo que está sucediendo con más detalle y mejor que nunca! Recomiendo encarecidamente leerlo.

¿Qué hay de pasar parámetros de línea de comandos a la aplicación? Me gusta esto :/Users/nicolas/Desktop/Firefox-29-fr/Firefox.app/Contents/MacOS/firefox -profile "/Users/nicolas/Desktop/Firefox-29-fr/Profil-Firefox-29-fr/" -no-remote &
@NicolasBarbulesco Esa es una pregunta separada: vea la página de manual para abrir y creo que hay una pregunta aquí
¿Qué hay de iniciar una aplicación específica, no estar en /Applications, sino en una ruta específica? Me gusta esto :/Users/nicolas/Desktop/Firefox-29-fr/Firefox.app/Contents/MacOS/firefox -profile "/Users/nicolas/Desktop/Firefox-29-fr/Profil-Firefox-29-fr/" -no-remote &
@NicolasBarbulesco abra [ruta completa], o cd al directorio y abra [archivo]. Puede usar ~/ para su carpeta de inicio y el carácter especial, "asterisco", como una notación más corta, suponiendo que ninguna otra cadena coincida con el valor, IE: ~/De*/Fire* ...etc. O simplemente escriba un guión simple: gato > nombredelguión ..... #! /bin/sh .... open [ruta completa] .... ^D ..... chmod +x nombredelscript..... .\nombredelscript .... y opcional, mv nombredelscript $PATH/yourpersonalbin. Recomiendo leer hombre abierto. Es un comando simple, y como un comando simple, la compensación es que no es tan poderoso.
Entonces: open /Applications/Mail.app/Contents/MacOS/Mail ; exitEsto inicia Mail. Pero: Esto termina mi ventana de Terminal. Y esto abre una nueva ventana de Terminal. Y, cuando cierro la nueva ventana de Terminal, Mail sale indeseablemente. Vuelta al cuadrado 1.
Lo siento, todavía necesito usar el argumento -a:open -a Applications/Mail.app/Contents/MacOS/Mail; exit
@njboot — Funciona — con un /. Pero termina mi ventana de Terminal.
open no se comporta como iniciar un programa desde la línea de comandos. Si ya se está ejecutando, la ventana simplemente se lleva al frente, no se vuelve a ejecutar.

He encontrado la solución :

(/Applications/Mail.app/Contents/MacOS/Mail &)

¡Es simple, es bonito y funciona!

Los paréntesis  ( )inician el comando en una subcapa.

--y el & regresa del programa al shell sin esperar, por lo que puede seguir usando el shell o terminarlo, sin que el programa que comenzó a salir.

@jksoegaard tiene los comandos adecuados, pero como mencionaste en el comentario, crea un archivo nohup.out. Para detener la creación del archivo nohup.out, debe redirigir STDOUT y STDERR a otro lugar. El comando completo sería nohup program &>/dev/null &. Esto ejecutará su programa en segundo plano, ignorando el SIGHUP y enviando todo STDOUT y STDERR a /dev/null.

Sin embargo, si no recordó agregar nohup (como en su pregunta original), puede usar el disown -arhcomando para marcar todos los trabajos en ejecución en segundo plano para ignorar el SIGHUP.

Buena respuesta, pero aún complicada. Y bonita imagen de perfil. :-)

o puedes probaropen -a /Applications/Mail.app

Uso: abrir [-e] [-t] [-f] [-W] [-R] [-n] [-g] [-h] [-s ][-b ] [-a ] [nombres de archivo] [--argumentos argumentos]
Ayuda: Abrir abre archivos desde un shell.
      De manera predeterminada, abre cada archivo usando la aplicación predeterminada para ese archivo.
      Si el archivo tiene la forma de una URL, el archivo se abrirá como una URL.
Opciones:
      -a Se abre con la aplicación especificada.
      -b Se abre con el identificador de paquete de aplicación especificado.
      -e Se abre con TextEdit.
      -t Se abre con el editor de texto predeterminado.
      -f Lee la entrada desde la entrada estándar y se abre con TextEdit.
      -F --fresh Inicia la aplicación desde cero, es decir, sin restaurar Windows. Se pierde el estado persistente guardado, excepto los documentos sin título.
      -R, --reveal Selecciona en el Finder en lugar de abrir.
      -W, --wait-apps Bloquea hasta que se cierran las aplicaciones utilizadas (incluso si ya se estaban ejecutando).
          --args Todos los argumentos restantes se pasan en argv a la función main() de la aplicación en lugar de abrirse.
      -n, --new Abre una nueva instancia de la aplicación incluso si ya se está ejecutando.
      -j, --hide Inicia la aplicación oculta.
      -g, --background No trae la aplicación al primer plano.
      -h, --header Busca ubicaciones de archivos de encabezado para encabezados que coincidan con los nombres de archivo dados y los abre.
      -s Para -h, el SDK a usar; si se proporciona, solo se buscan los SDK cuyos nombres contienen el valor del argumento.
                        De lo contrario, se utiliza el SDK con la versión más alta en cada plataforma.

He encontrado una solución: combatir el mal con el mal.

Lanzo mi aplicación con este tipo de comando:

/Applications/Mail.app/Contents/MacOS/Mail & exit

El caparazón sale de inmediato. Y la aplicación sobrevive, incluso después de cerrar la ventana de Terminal.

Pero esta solución no es muy útil.

Realmente debería abrir aplicaciones que se incluyen con Open . Eso es una prueba de futuro a medida que cambia el contenido del paquete, así como canónico.
@Ian: aquí estoy particularmente interesado en abrir aplicaciones que están en una ruta específica, no en /Applications, y no incluidas en mi Mac.
.appLas carpetas se denominan "paquetes" y el opencomando puede iniciarlas ya sea que estén en la /Applicationscarpeta o en cualquier otra carpeta. El término "paquete" en este contexto no significa "enviado con OS X".
abrir es lo mismo que hacer clic en el icono. No es lo mismo lanzar la app desde la línea de comandos como pide el OP.