Come avviare in modo pulito un'applicazione GUI tramite il terminale?

71

Alcune app della GUI si aprono in modo pulito tramite la riga di comando del terminale, ma altre no, e fanno in modo che il terminale attenda che l'app termini. Anche allora, alcuni non "rilasciano" la riga di comando.

Il misterioso suffisso commerciale e & sembra far sì che il terminale metta il processo in secondo piano (ma non sono sicuro di cosa accada lì).

C'è un modo per avviare un'app tramite il Terminale in modo che non ci sia alcun effetto "hang on", proprio come avviare qualcosa via Alt + F2 ?

Mi piacerebbe avere la linea di comando nuovamente disponibile immediatamente, senza qualcosa di ancora sullo sfondo e la stampa nel terminale.

    
posta Peter.O 31.10.2010 - 11:50

10 risposte

17

Nel caso di Gedit, tengo sempre una copia aperta tutto il tempo. Finché hai una copia esistente in esecuzione, l'avvio delle chiamate gedit dal terminale e la chiusura del terminale non uccideranno gedit.

Per altre cose, anche quello che altre persone hanno detto funzionerebbe. Sono un fan di nohup ... Ma se hai bisogno di un terminale puoi staccarlo ma poi ricollegarlo, vuoi guardare screen .

  1. eseguilo in un terminale e poi esegui qualcosa che continui a spingere in uscita. Io uso il server di sviluppo Django ma irssi o anche watch uptime sarebbe un buon esempio.
  2. Elimina il terminale e ne inizi uno nuovo.
  3. Esegui screen -r e BOOM, sei di nuovo in.

screen è molto più grande di quello e puoi combinarlo con byobu per un'esperienza terminale migliore. Leggi in giro.

    
risposta data Oli 31.05.2011 - 14:25
80

Supponiamo che gedit sia il programma che vuoi eseguire staccato (aka. "sconosciuto", "districato", "disaccoppiato"). Ci sono diversi modi in base a cosa vuoi fare esattamente:

Programma già in esecuzione

rinnegare:

disown -h è la strada da percorrere se vuoi farlo con un programma già in esecuzione (ad esempio, se ti sei dimenticato di nohup ). Devi prima fermarlo usando Ctrl + Z . Quindi puoi inserire la parentesi utilizzando bg [jobId] (ad esempio bg 1 ). Viene visualizzato un elenco di lavori in esecuzione con il relativo ID lavoro utilizzando jobs . Dopodiché puoi scollegarlo dal terminale usando disown -h %[jobId] . Esempio di sessione terminale:

$ gedit 
^Z
[1]+  Stopped                 gedit
$ jobs
[1]+  Stopped                 gedit
$ bg 1
[1]+ gedit &
$ disown -h %1
$ exit

Programma non ancora avviato

nohup

nohup non è sempre presente su tutte le macchine. Se sai che vuoi disaccoppiare prima, useresti:

nohup gedit &

Forse vorresti reindirizzare anche l'output della shell e il tuo programma una pseudo fonte di input, quindi: nohup ./myprogram > foo.out 2> bar.err < /dev/null & . Dovresti reindirizzare l'output per non essere disturbato da esso o per usarlo in seguito. L'input null può aiutare a prevenire hickups in ssh un tale.

subshell:

Puoi ottenere un effetto simile

$ (geany >/dev/null 2>&1 &)

Le parentesi aprono una nuova sottoshell per eseguire gedit. Il >/dev/null 2>&1 reindirizza l'output della shell in nessun posto (sopprimendo l'output). E il & alla fine pone il processo in background.

Terminal multiplexing

Anche multiplexing del terminale usando la schermata o Byobu . Fondamentalmente esegui il programma in un terminale tutto suo. Posso davvero consigliare byobu anche per altri motivi. Di seguito è riportato un elenco di scorciatoie di boybu che potrebbero rivelarsi utili per i primi passi:

utili:

  • F2 Crea una nuova finestra
  • F3 Passa alla finestra successiva
  • F4 Passa alla finestra precedente
  • F6 Scollega dalla sessione e disconnessione
  • Maiusc-F6 Scollega dalla sessione, ma non eseguire il logout
  • F7 Entra in modalità scorrimento / ricerca
  • Ctrl-F5 Riconnetti qualsiasi socket o agente SSH / GPG

Meno utile:

  • Maiusc-F2 Dividi lo schermo in orizzontale
  • Ctrl-F2 Dividi lo schermo verticalmente
  • Maiusc-F3 sposta lo stato attivo sulla successiva divisione
  • Maiusc-F4 sposta lo stato attivo sulla divisione precedente
  • Maiusc-F5 Comprimi tutte le divisioni
  • F5 Aggiorna tutte le notifiche di stato
  • F8 Rinomina la finestra corrente
  • F9 Avvia il menu di configurazione di Byobu
  • F12 Chiave di fuga dello schermo GNU
  • Alt-Pageup Ritorna indietro nella cronologia di questa finestra
  • Alt-Pagedown Scorri in avanti attraverso la cronologia di questa finestra
  • Ctrl-a -! Attiva o disattiva tutte le combinazioni di tasti di Byobu

Il daemon 'at' e altri

at è un utile piccolo strumento per eseguire un comando in un momento programmato. Può essere "usato male" per staccare un comando dalla shell:

echo './myprogram myoption1 myoption2' | at now

Puoi anche esaminare setsid e start-stop-daemon , ma gli altri metodi dovrebbero essere sufficienti.

    
risposta data con-f-use 31.05.2011 - 14:28
25
% Bl0ck_qu0te%

Lo fa, ed è spesso quello che vuoi. Se dimentichi di usare & amp ;, puoi sospendere il programma con ctrl-z quindi posizionarlo in background con il comando bg e continuare a usare quella shell.

Il processo 'stdin, stdout e stderr sono ancora connessi al terminale; puoi reindirizzare quelli da / a / dev / null o qualsiasi altro file (ad esempio, salvare un registro di output da qualche parte), come desiderato:

some-program </dev/null &>/dev/null &
# &>file is bash for 1>file 2>&1

Puoi vedere il processo nei lavori, riportarlo in primo piano (comando fg) e inviarlo segnali (comando kill).

Alcuni programmi grafici verranno staccati dal terminale; se questo è il caso, quando esegui il comando "normalmente" noterai che avvia il programma grafico e "esci".

Ecco un breve script , puoi inserirlo in ~/bin , che ho chiamato runbg:

#!/bin/bash
[ $# -eq 0 ] && {  # $# is number of args
  echo "$(basename $0): missing command" >&2
  exit 1
}
prog="$(which "$1")"  # see below
[ -z "$prog" ] && {
  echo "$(basename $0): unknown command: $1" >&2
  exit 1
}
shift  # remove $1, now $prog, from args
tty -s && exec </dev/null      # if stdin is a terminal, redirect from null
tty -s <&1 && exec >/dev/null  # if stdout is a terminal, redirect to null
tty -s <&2 && exec 2>&1        # stderr to stdout (which might not be null)
"$prog" "[email protected]" &  # [email protected] is all args

Guardo il programma ($ prog) prima di reindirizzare in modo che gli errori nel localizzarlo possano essere segnalati. Eseguilo come "runbg your-command args ..."; puoi ancora reindirizzare lo stdout / err su un file se hai bisogno di salvare l'output da qualche parte.

Ad eccezione dei reindirizzamenti e della gestione degli errori, questo è equivalente a risposta di htorque .

    
risposta data Roger Pate 31.10.2010 - 12:25
20

Usa nohup

% Bl0ck_qu0te%

Ad esempio:

nohup gedit something
    
risposta data Florian Diesch 31.05.2011 - 14:10
18

Per avviare un'applicazione e staccarla dal terminale lanciato, usa & amp;!.

firefox &!
    
risposta data Rick 31.10.2010 - 13:20
4

Apri il terminale, digita screen , digita il comando che vuoi eseguire, chiudi il terminale. Il programma dovrebbe continuare a essere eseguito nella sessione Schermo GNU .

    
risposta data RobinJ 31.05.2011 - 17:00
1

Questo ha funzionato per me:

$ (nohup gedit 2>/dev/null &)
    
risposta data wesleycoder 31.12.2012 - 00:20
0

Come molte persone hanno capito, nohup è la cosa da considerare. Ma nessun fermo immagine rimane aperto sul terminale e visualizza l'attività del programma sul terminale che è irritante. Puoi semplicemente chiudere il terminale dopo questo per evitarlo. Ho scoperto una soluzione molto semplice che uso.

nohup gedit & exit

E questo è tutto. Apre gedit e chiude il terminale quando gedit si avvia. Poiché gedit non è associato al terminale ora, rimane attivo.

    
risposta data Lokesh Devnani 03.09.2015 - 19:25
0

Funziona anche all'interno di uno script (come alias, il trailer "& amp;" non è normalmente consentito negli script perché non sono interattivi):

bash -i >/dev/null 2>&1 <<<'nohup gedit &'
    
risposta data Sam 02.01.2018 - 20:40
0

Questo ha funzionato per me:

$ (some-program &) &>/dev/null

# Examples:
$ (gedit &) &>/dev/null
$ (google-chrome &) &>/dev/null
    
risposta data Eyal Levin 13.06.2018 - 10:43

Leggi altre domande sui tag