¿Cómo evitar que la aplicación iniciada en Terminal salga indeseablemente?

10

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 programa hace que el programa viva solo.
    • Recuerdo haber lanzado un comando como  xeyes &y hacer que el programa se ejecute 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 se cierra!
    2. ¿Por qué ocurre este comportamiento indeseable en Mac OS X?
    3. Cómo se puede arreglar esto ?
Nicolas Barbulesco
fuente
Pregunta relacionada: apple.stackexchange.com/q/119319/20773
Eric3

Respuestas:

7

La forma "estándar" de lograr lo que desea lograr (en OS X, así 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 bloqueo debido al comando nohup.

De esta manera, el programa seguirá 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.

jksoegaard
fuente
1
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.outen todas partes en mi Mac. :-(
Nicolas Barbulesco
1
@NicolasBarbulesco Use cualquiera nohup command>/dev/null&o command&disown.
Lri
6

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

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

Alan Shutko
fuente
6

Usando el signo " &", le está diciendo a Terminal que ejecute el proceso en el fondo del shell. Por lo tanto, cuando cierra el shell (y elimina el proceso), también se cerrará la GUI (Mail.app).

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 leerlo.

njboot
fuente
¿Qué pasa con pasar parámetros de línea de comandos a la aplicación? Así:/Users/nicolas/Desktop/Firefox-29-fr/Firefox.app/Contents/MacOS/firefox -profile "/Users/nicolas/Desktop/Firefox-29-fr/Profil-Firefox-29-fr/" -no-remote &
Nicolas Barbulesco
2
@NicolasBarbulesco Esa es una pregunta separada: vea la página del manual para abrir y creo que hay una pregunta aquí
usuario151019
¿Qué pasa con el lanzamiento de una aplicación específica, no estar dentro /Applications, sino en una ruta específica? Así:/Users/nicolas/Desktop/Firefox-29-fr/Firefox.app/Contents/MacOS/firefox -profile "/Users/nicolas/Desktop/Firefox-29-fr/Profil-Firefox-29-fr/" -no-remote &
Nicolas Barbulesco
@NicolasBarbulesco abre [ruta completa], o cd al directorio y abre [archivo]. Puede usar ~ / para su carpeta de inicio y el carácter especial, "asterisco", como notación más corta, suponiendo que ninguna otra cadena coincida con el valor, IE: ~ / De * / Fire * ... etcétera. O simplemente escriba un script simple: cat> nameofscript ..... #! / bin / sh .... abrir [ruta completa] .... ^ D ..... chmod + x nameofscript ...... \ nameofscript .... y opcional, mv nameofscript $ PATH / yourpersonalbin. Recomiendo leer al hombre abierto. Es un comando simple, y como un comando simple, la compensación es que no es tan poderoso.
njboot
1
Lo sentimos, todavía necesito usar el argumento -a:open -a Applications/Mail.app/Contents/MacOS/Mail; exit
njboot
3

@jksoegaard tiene los comandos adecuados, pero como mencionó en el comentario, crea un archivo nohup.out. Para evitar que se cree el 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 SIGHUP y enviando todo STDOUT y STDERR a / dev / null.

Sin embargo, si no recuerda 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.

Software Insomniac
fuente
Buena respuesta, pero aún complicada. Y bonita imagen de perfil. :-)
Nicolas Barbulesco
3

He encontrado la solución :

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

¡Es simple, es bonito y funciona!

Los paréntesis  ( )inician el comando en un sub-shell.

Nicolas Barbulesco
fuente
--y el & regresa del programa al shell sin esperar, para que pueda seguir usando el shell o terminarlo, sin el programa que comenzó a salir.
r_alex_hall
0

O puedes intentar open -a /Applications/Mail.app

Uso: abierto [-e] [-t] [-f] [-W] [-R] [-n] [-g] [-h] [-s] [- b] [-a] [nombres de archivo] [--argumentos argumentos]
Ayuda: Abrir abre archivos desde un shell.
      Por defecto, 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 de la entrada estándar y se abre con TextEdit.
      -F --fresh Inicia la aplicación fresca, es decir, sin restaurar ventanas. El estado persistente guardado se pierde, excluyendo los documentos sin título.
      -R, --reveal Selecciona en el Finder en lugar de abrirlo.
      -W, --wait-apps Bloquea hasta que se cierren 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 en las ubicaciones de los archivos de encabezado los encabezados que coinciden 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.
Halomaple
fuente
-2

He encontrado una solución: luchar contra el mal con el mal.

Lanzo mi aplicación con este tipo de comando:

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

La cáscara sale a la vez. Y la aplicación sobrevive, incluso después de cerrar la ventana de Terminal.

Pero esta solución no es muy útil.

Nicolas Barbulesco
fuente
1
Realmente deberías estar abriendo aplicaciones que están incluidas con open . Eso es una prueba futura, ya que el contenido del paquete cambia y también es canónico.
Ian C.
@ 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.
Nicolas Barbulesco
1
.appLas carpetas se denominan "paquetes" y el opencomando puede iniciarlas tanto si están en la /Applicationscarpeta como en cualquier otra carpeta. El término "paquete" en este contexto no significa "enviado con OS X".
nadie
abrir es lo mismo que hacer clic en el icono. No es lo mismo iniciar la aplicación desde la línea de comandos que el OP pregunta.
Ted Bigham