Come impedire che l'applicazione lanciata nel Terminale venga indesideratamente chiusa?


10

Lancio applicazioni dal Terminale con comandi come questo:

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

La parte importante è il  &.

  • Per Unix / Linux / Solaris:

    • Ho imparato a scuola che l'aggiunta  &del programma rende il programma autonomo.
    • Ricordo con forza lanciando un comando come  xeyes &e avere il programma in esecuzione sicuro anche dopo la chiusura del guscio.
  • Su Mac OS X (Unix all'interno):

    1. Avvio un'app con  &e chiudo la finestra Terminale: l'applicazione si chiude!
    2. Perché questo comportamento indesiderato si verifica su Mac OS X?
    3. Come si puo aggiustare ?

Risposte:


7

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

nohup program &

Verrà avviato program, che verrà eseguito in background rispetto alla shell a causa del &- e ignorerà i segnali di blocco a causa del comando nohup.

In questo modo il programma continuerà a funzionare anche se si chiude 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 simili.


1
Questo crea un file nohup.outnella cartella corrente. Anche quando non c'è nulla da scrivere. Dopo alcune settimane, avrei avuto file nohup.outovunque sul mio Mac. :-(
Nicolas Barbulesco,

1
@NicolasBarbulesco Utilizzare nohup command>/dev/null&o command&disown.
Lri,

6

Quando si chiude una finestra di terminale, invia un SIGHUP (segnale di blocco) alla shell, che quindi invia SIGHUP a tutti i processi avviati . Questo è un comportamento tradizionale per bash e molte altre shell, e la soluzione tradizionale è usare nohup.

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


6

Usando la " &" e commerciale , stai dicendo a Terminal di eseguire il processo sullo sfondo della shell stessa. Pertanto, quando si chiude la shell (e si interrompe il processo), anche la GUI (Mail.app stessa) si chiuderà.

Il comando corretto per avviare Mail dal terminale è semplicemente:

open -a Mail; exit

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


Che dire di passare i parametri della riga di comando all'app? In questo modo:/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 Questa è una domanda separata - vedi la pagina man per aprire e penso che una domanda qui
user151019

Che dire di lanciare un'applicazione specifica, non trovarsi in /Applications, ma in un percorso specifico? In questo modo:/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 open [percorso completo] o cd nella directory e apri [file]. Puoi usare ~ / per la tua cartella home e il carattere speciale, "asterisco", poiché la notazione più breve supponendo che nessuna altra stringa corrisponda al valore, IE: ~ / De * / Fire * ... eccetera. O semplicemente scrivi un semplice script: cat> nameofscript ..... #! / bin / sh .... apri [percorso completo] .... ^ D ..... chmod + x nameofscript ...... \ nameofscript .... e facoltativo, mv nameofscript $ PATH / yourpersonalbin. Irecommend leggendo l'uomo aperto. È un comando semplice e come semplice comando il compromesso è che non è così potente.
njboot,

1
Siamo spiacenti, è comunque necessario utilizzare l'argomento -a:open -a Applications/Mail.app/Contents/MacOS/Mail; exit
njboot

3

@jksoegaard ha i comandi corretti ma, come hai detto 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 STDOUT e STDERR a / dev / null.

Tuttavia, se non ti ricordi di aggiungere nohup (come nella domanda originale), puoi utilizzare il disown -arhcomando per contrassegnare tutti i processi in esecuzione in background per ignorare SIGHUP.


Bella risposta, ma ancora complicata. E bella immagine del profilo. :-)
Nicolas Barbulesco,

3

Ho trovato la soluzione :

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

È semplice, è carino e funziona!

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


--e il & ritorna dal programma alla shell senza aspettare, quindi puoi continuare a usare la shell o terminarla, senza il programma da cui hai iniziato a uscire.
r_alex_hall,

0

Oppure puoi provare open -a /Applications/Mail.app

Utilizzo: open [-e] [-t] [-f] [-W] [-R] [-n] [-g] [-h] [-s] [- b] [-a] [nomi file] [--args argomenti]
Aiuto: Apri apre i file da una shell.
      Per impostazione predefinita, apre ogni file utilizzando l'applicazione predefinita per quel file.
      Se il file ha la forma di un URL, il file verrà aperto come URL.
Opzioni:
      -a Si apre con l'applicazione specificata.
      -b Si apre con l'identificatore del bundle dell'applicazione specificato.
      -e Si apre con TextEdit.
      -t Si apre con l'editor di testo predefinito.
      -f Legge l'input dall'input standard e si apre con TextEdit.
      -F --fresh Avvia l'app fresca, cioè senza ripristinare Windows. Lo stato persistente salvato viene perso, esclusi i documenti senza titolo.
      -R, --reveal Seleziona nel Finder invece di aprirlo.
      -W, --wait-apps Blocca fino alla chiusura delle applicazioni utilizzate (anche se erano già in esecuzione).
          --args Tutti gli argomenti rimanenti vengono passati in argv alla funzione main () dell'applicazione anziché aperta.
      -n, --new Apre una nuova istanza dell'applicazione anche se è già in esecuzione.
      -j, --hide Avvia l'app nascosta.
      -g, --background Non porta l'applicazione in primo piano.
      -h, --header Cerca le posizioni dei file di intestazione per le intestazioni corrispondenti ai nomi di file indicati e le apre.
      -s Per -h, l'SDK da usare; se fornito, vengono cercati solo SDK i cui nomi contengono il valore dell'argomento.
                        Altrimenti viene utilizzato l'SDK con la versione più alta in ciascuna piattaforma.

-2

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

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


1
Dovresti davvero aprire Applicazioni in bundle con open . Questa è una prova futura poiché i contenuti del pacchetto cambiano e sono canonici.
Ian C.

@Ian - Qui sono particolarmente interessato all'apertura di applicazioni che si trovano in un percorso specifico, non in /Applications, e non in bundle con il mio Mac.
Nicolas Barbulesco,

1
.apple cartelle sono chiamate "bundle" e il opencomando può avviarle sia nella /Applicationscartella che in qualsiasi altra cartella. Il termine "bundle" in questo contesto non significa "spedito con OS X".
nessuno il

open equivale a fare clic sull'icona. Non è lo stesso che avviare l'app dalla riga di comando come richiesto dall'OP.
Ted Bigham,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.