Come impedire che l'applicazione avviata nel terminale si interrompa in modo indesiderato?

10

Lancio applicazioni dal Terminale con comandi come questo:

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

La parte importante è & .

  • Per Unix / Linux / Solaris:

    • Ho imparato a scuola che aggiungere & fa vivere il programma da solo.
    • Ricordo con forza il lancio di un comando come xeyes & e il fatto che il programma sia sicuro anche dopo aver chiuso la shell.
  • Su Mac OS X (Unix all'interno):

    1. avvio un'applicazione con & e chiudo la finestra del terminale: l'applicazione esce!
    2. Perché questo comportamento indesiderato si verifica su Mac OS X?
    3. Come può essere risolto?
posta Nicolas Barbulesco 05.06.2014 - 23:01
fonte

7 risposte

3

Ho trovato la soluzione:

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

È semplice, è carina e funziona!

Le parentesi ( ) lanciano il comando in una sotto-shell.

    
risposta data 06.06.2014 - 17:33
fonte
7

Il modo "standard" per realizzare ciò che vuoi realizzare (su OS X e su Linux, FreeBSD o altri sistemi) è usare il comando nohup :

nohup program &

Questo avvierà program , che verrà eseguito in background rispetto alla shell a causa di & - e ignorerà i segnali di hangup dovuti al comando nohup.

In questo modo il programma continuerà a funzionare anche se chiudi la shell. Non importa se stai chiudendo la shell perché stai chiudendo Terminal.app, o stai chiudendo la shell perché ti stai disconnettendo da una connessione SSH al computer o simile.

    
risposta data 05.06.2014 - 23:40
fonte
6

Quando chiudi una finestra di terminale, invia un SIGHUP (segnale di hangup) alla shell, che quindi invia SIGHUP a tutti i processi avviati . Questo è un comportamento tradizionale per bash e molti altri shell, e la soluzione tradizionale per questo è usare nohup.

Ci sono modi in cui diverse macchine Unix possono essere diverse, quindi è possibile che gli specifici emulatori di terminale che hai usato o le shell specifiche che hai usato si comportassero in modo diverso. Ma non è specifico per OS X. Ad esempio, c'è una domanda su questo stesso problema su Ubuntu.

    
risposta data 05.06.2014 - 23:20
fonte
6

Usando la e commerciale " & ", stai dicendo a Terminal di eseguire il processo sullo sfondo della shell stessa. Quindi, chiudendo la shell (e uccidendo il processo), verrà chiusa anche la GUI (Mail.app stessa).

Il comando corretto per avviare Mail dal terminale è semplicemente:

open -a Mail; exit

Modifica: l'ho appena trovato su U & L Stack Exchange: Che cosa significa" e commerciale "alla fine di una linea di script della shell? Le risposte fornite sono eccellenti e spiegano esattamente cosa sta succedendo in modo più dettagliato meglio di quanto potrei mai! Consiglio vivamente di leggerlo.

    
risposta data 05.06.2014 - 23:08
fonte
3

@jksoegaard ha i comandi corretti ma, come hai menzionato nel commento, crea un file nohup.out. Per interrompere la creazione del file nohup.out, è necessario reindirizzare STDOUT e STDERR da qualche altra parte. Il comando completo sarebbe nohup program &>/dev/null & . Questo eseguirà il tuo programma in background, ignorando SIGHUP e inviando tutti gli STDOUT e STDERR a / dev / null.

Tuttavia, se non ti ricordi di aggiungere nohup (come nella tua domanda originale), puoi usare il comando disown -arh per contrassegnare tutti i lavori in esecuzione in background per ignorare SIGHUP.

    
risposta data 06.06.2014 - 01:02
fonte
0

Oppure puoi provare 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.
    
risposta data 11.05.2018 - 16:13
fonte
-2

Ho trovato una soluzione: combattere il male con il male.

Lancio la mia app con questo tipo di comando:

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

La shell esce immediatamente. E l'app sopravvive anche dopo aver chiuso la finestra del Terminale.

Ma questa soluzione non è molto utile.

    
risposta data 06.06.2014 - 00:04
fonte

Leggi altre domande sui tag