Come si inviano le app della riga di comando direttamente in background?


22

So già che la pressione ctrl+zarresta l'app, quindi posso inviare l'app in background con il bgcomando, ma ciò significa che c'è un breve periodo di tempo in cui l'app viene arrestata.

Come posso inviare l'app direttamente in background senza interromperla?


Abbastanza sicuro che non puoi, se è già in esecuzione.
Kevin,

1
Se la tua attività richiede il tuo input "prima di scomparire" in background, puoi usare strumenti come zenity o yad (se ti piacciono i guis). Possono ancora inviare e ricevere output dallo sfondo. Sono sicuro che giocare con pipe e dispositivi ti permetterebbe anche di accedere alla console dallo sfondo, ma non sono sicuro di come farlo.
Joe,

@Joe Questo è bello, ma non è quello che intendo. Voglio solo inviare un'app direttamente in background senza metterla in pausa. cioè senza premere ctrl+zseguito dall'esecuzione del comando bg. Esiste un'unica combinazione di tasti per inviare l'app in background?
trusktr,

Risposte:


17

L'invio di un'applicazione dal primo piano allo sfondo richiede la cooperazione sia dal terminale che dalla shell. Il terminale non può farlo da solo, perché la shell deve impostare il gruppo di processi in primo piano. La shell non può farcela da sola, perché il terminale deve elaborare la pressione del tasto (la shell non è in primo piano, quindi non può ricevere una pressione del tasto).

Un'approssimazione ravvicinata è quella di inviare l'applicazione in background molto velocemente. Dopotutto, un'applicazione condivide il tempo della CPU con gli altri e una pausa di qualche centesimo di secondo non dovrebbe importare. (Lo fa per le applicazioni in tempo reale, quindi assicurati di avviarle in background.) Uso un'associazione shell per Ctrl+ Zche invia il lavoro in primo piano in background. In questo modo, premendo Ctrl+ Z Ctrl+ si Zinvia un lavoro in background con un tempo di sospensione minimo.

Ecco la mia associazione zsh, che anche "sfondo" un comando mezzo digitato quando la riga di comando non è vuota .

fancy-ctrl-z () {
  emulate -LR zsh
  if [[ $#BUFFER -eq 0 ]]; then
    bg
    zle redisplay
  else
    zle push-input
  fi
}
zle -N fancy-ctrl-z
bindkey '^Z'          fancy-ctrl-z

In inglese, per gli utenti non zsh nel pubblico:

  • Definire una funzione shell che procede come segue:

  • Associa questa funzione a Ctrl+ Z.

Se si desidera solo il comportamento in background indipendentemente dal fatto che la riga di comando sia vuota:

function bg_ { builtin bg "$@"; }
zle -N bg_
bindkey '^Z' bg_

Non so se puoi fare lo stesso a Bash. Dovrebbe essere facile come bind -x '"\C-z": bg', tranne per il fatto che bash lascia in posizione il carattere tty stop, quindi non ottiene mai Ctrl+ Zcome input.


Interessante, fammi vedere se questo può essere fatto in Bash. Se è così, questa sarebbe una soluzione. Non ho familiarità con zsh. Ti dispiace spiegare cosa fa la tua sceneggiatura?
trusktr,

@trusktr Vedi la mia modifica.
Gilles 'SO- smetti di essere malvagio' il

Grazie! Sto per passare a zsh. Ho sentito tante cose positive al riguardo.
trusktr,

15

È possibile creare un'attività in background aggiungendone una &dopo.

Ad esempio tail -f /var/log/messages &eseguirà immediatamente l'attività in background.

Come sempre puoi vedere quali attività hai eseguito il background con il jobscomando.

Questo ovviamente presuppone che tu non abbia ancora eseguito il comando.


È utile, ma non è quello che intendo. Se ho l'app in primo piano, quindi voglio inviarla in background in un secondo momento, posso premere ctrl+zquindi eseguire bgdalla riga di comando all'app che viene eseguita in background. Ma tra premere ctrl+zed eseguire bg, c'è un periodo di tempo in cui l'app è completamente in pausa. Non lo voglio. Come posso inviarlo immediatamente in background ?
trusktr,

@trusktr come ha detto Gilles. È necessario informare sia la shell che il terminale. Scusa, non conosco un modo per farlo.
prateek61,

Non risponde alla domanda.
Luciano Andress Martini,

4

Lo sfondo di un comando viene eseguito aggiungendo una e commerciale al comando.

sleep 300 &

Se è già in esecuzione, l'unica opzione è quella di fermarlo, quindi in background.


Tra la pressione di ctrl + z e l'esecuzione di bg, c'è un intervallo di tempo in cui l'app è completamente in pausa, che è ciò che non voglio. Quindi non c'è modo di inviarlo immediatamente in background ?
trusktr,

1
No. Come ha detto Giles, ci vogliono sia il guscio che il terminale. Devi informare ciascuno.
bahamat,
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.