¿Cómo evitar que la aplicación iniciada en Terminal se cierre de forma no deseada?

10

Ejecuto aplicaciones desde la Terminal con comandos como este:

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

La parte importante es el & .

  • Para Unix / Linux / Solaris:

    • Aprendí en la escuela que agregar el & hace que el programa viva por su cuenta.
    • Recuerdo firmemente haber ejecutado un comando como xeyes & y haber ejecutado el programa de forma segura incluso después de cerrar la shell.
  • En Mac OS X (Unix adentro):

    1. Ejecuto una aplicación con & y cierro la ventana de Terminal: ¡la aplicación sale!
    2. ¿Por qué ocurre este comportamiento no deseado en Mac OS X?
    3. ¿Cómo se puede arreglar esto?
pregunta Nicolas Barbulesco 05.06.2014 - 23:01

7 respuestas

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.

    
respondido por el Nicolas Barbulesco 06.06.2014 - 17:33
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 iniciará 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 continuará ejecutándose aunque cierre el shell. No importa si está cerrando el shell porque está cerrando Terminal.app, o está cerrando el shell porque se está desconectando de una conexión ssh a la computadora, o similar.

    
respondido por el jksoegaard 05.06.2014 - 23:40
6

Cuando cierras 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 de 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 usaste o los shells específicos que usaste se comporten de manera diferente. Pero no es específico de OS X. Por ejemplo, hay una pregunta sobre este mismo problema en Ubuntu.

    
respondido por el Alan Shutko 05.06.2014 - 23:20
6

Al usar el símbolo " & ", le estás diciendo a Terminal que ejecute el proceso en el fondo del shell. Por lo tanto, cuando cierra el shell (y finaliza el proceso), la GUI (Mail.app) 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 la palabra" y "al final de una línea de script de shell? Las respuestas proporcionadas son excelentes y explican exactamente lo que sucede con más detalle y ¡Mejor que nunca! Recomiendo altamente leerlo.

    
respondido por el njboot 05.06.2014 - 23:08
3

@jksoegaard tiene los comandos adecuados pero, como mencionó en el comentario, crea un archivo nohup.out. Para detener la creación del archivo nohup.out, debe redireccionar 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 todos los STDOUT y STDERR a / dev / null.

Sin embargo, si no recuerdas agregar nohup (como en tu pregunta original), puedes usar el comando disown -arh para marcar todos los trabajos en ejecución en segundo plano para ignorar el SIGHUP.     

respondido por el Insomniac Software 06.06.2014 - 01:02
0

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

Usage: open [-e] [-t] [-f] [-W] [-R] [-n] [-g] [-h] [-s ][-b ] [-a ] [filenames] [--args arguments]
Help: Open opens files from a shell.
      By default, opens each file using the default application for that file.
      If the file is in the form of a URL, the file will be opened as a URL.
Options:
      -a                Opens with the specified application.
      -b                Opens with the specified application bundle identifier.
      -e                Opens with TextEdit.
      -t                Opens with default text editor.
      -f                Reads input from standard input and opens with TextEdit.
      -F  --fresh       Launches the app fresh, that is, without restoring windows. Saved persistent state is lost, excluding Untitled documents.
      -R, --reveal      Selects in the Finder instead of opening.
      -W, --wait-apps   Blocks until the used applications are closed (even if they were already running).
          --args        All remaining arguments are passed in argv to the application's main() function instead of opened.
      -n, --new         Open a new instance of the application even if one is already running.
      -j, --hide        Launches the app hidden.
      -g, --background  Does not bring the application to the foreground.
      -h, --header      Searches header file locations for headers matching the given filenames, and opens them.
      -s                For -h, the SDK to use; if supplied, only SDKs whose names contain the argument value are searched.
                        Otherwise the highest versioned SDK in each platform is used.
    
respondido por el Halomaple 11.05.2018 - 16:13
-2

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

Ejecuto 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 que cierre la ventana de la Terminal.

Pero esta solución no es muy útil.

    
respondido por el Nicolas Barbulesco 06.06.2014 - 00:04

Lea otras preguntas en las etiquetas