Comment envoyer des applications de ligne de commande directement en arrière-plan?

22

Je sais déjà qu'en appuyant sur l' ctrl+zarrêt de l'application, je peux envoyer l'application en arrière-plan avec la bgcommande, mais cela signifie qu'il y a une brève période de temps pendant laquelle l'application est arrêtée.

Comment envoyer l'application directement en arrière-plan sans l'arrêter?

trusktr
la source
Je suis sûr que vous ne pouvez pas, s'il est déjà en cours d'exécution.
Kevin
1
Si votre tâche nécessite votre entrée "avant de disparaître" en arrière-plan, vous pouvez utiliser des outils comme zenity ou yad (si vous aimez guis). Ils peuvent toujours envoyer et recevoir une sortie de l'arrière-plan. Je suis sûr que jouer avec des tuyaux et des appareils vous permettrait également d'accéder à la console depuis l'arrière-plan, mais je ne sais pas comment le faire.
Joe
@Joe C'est cool, mais pas du tout ce que je veux dire. Je veux simplement envoyer une application directement en arrière-plan sans l'interrompre. c'est-à-dire sans appuyer ctrl+zsuivi de l'exécution de la commande bg. Existe-t-il une seule combinaison de touches pour envoyer l'application en arrière-plan?
trusktr

Réponses:

17

L'envoi d'une application du premier plan à l'arrière-plan nécessite la coopération du terminal et du shell. Le terminal ne peut pas le faire seul, car le shell doit définir le groupe de processus de premier plan. Le shell ne peut pas le faire seul, car le terminal doit traiter la pression de touche (le shell n'est pas au premier plan, il ne peut donc pas recevoir de pression de touche).

Une approximation proche consiste à envoyer l'application en arrière-plan très rapidement. Après tout, une application partage le temps CPU avec d'autres et une pause de quelques centièmes de seconde ne devrait pas avoir d'importance. (Il le fait pour les applications en temps réel, alors assurez-vous de démarrer celles en arrière-plan.) J'utilise une liaison shell pour Ctrl+ Zqui envoie le dernier travail au premier plan à l'arrière-plan. De cette façon, une pression sur Ctrl+ Z Ctrl+ Zenvoie un travail en arrière-plan avec un temps de suspension minimal.

Voici ma liaison zsh, qui «fond» également une commande à moitié tapée lorsque la ligne de commande n'est pas vide .

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

En anglais, pour les non-utilisateurs de zsh du public:

  • Définissez une fonction shell qui effectue les opérations suivantes:

  • Liez cette fonction à Ctrl+ Z.

Si vous souhaitez simplement le comportement d'arrière-plan, que la ligne de commande soit vide ou non:

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

Je ne sais pas si tu peux faire la même chose en bash. Cela devrait être aussi simple que bind -x '"\C-z": bg', sauf que bash laisse le caractère tty stop en place, donc il n'obtient jamais Ctrl+ Zcomme entrée.

Gilles 'SO- arrête d'être méchant'
la source
Intéressant, laissez-moi voir si cela peut être fait dans Bash. Si oui, ce serait une solution. Je ne connais pas zsh. Voulez-vous expliquer ce que fait votre script?
trusktr
@trusktr Voir ma modification.
Gilles 'SO- arrête d'être méchant'
Merci! Je suis sur le point de passer à zsh. J'ai entendu tellement de bonnes choses à ce sujet.
trusktr
15

Vous pouvez créer un arrière-plan pour une tâche en ajoutant un &après.

Par exemple tail -f /var/log/messages &, la tâche sera immédiatement mise en arrière-plan.

Comme toujours, vous pouvez voir quelles tâches vous avez mises en arrière-plan avec la jobscommande.

Cela suppose bien sûr que vous n'avez pas encore exécuté la commande.

prateek61
la source
C'est utile, mais pas ce que je veux dire. Si j'ai l'application au premier plan et que je souhaite l'envoyer en arrière-plan plus tard, je peux appuyer sur ctrl+zpuis exécuter bgsur la ligne de commande pour que l'application s'exécute en arrière-plan. Mais entre la pression ctrl+zet l'exécution bg, il y a un délai pendant lequel l'application est complètement suspendue. Je n'en veux pas. Comment l'envoyer immédiatement en arrière - plan ?
trusktr
@trusktr comme Gilles l'a dit. Vous devez informer le shell et le terminal. Désolé, je ne connais aucun moyen de le faire.
prateek61
Cela ne répond pas à la question.
Luciano Andress Martini
4

La mise en arrière-plan d'une commande se fait en ajoutant une esperluette à la commande.

sleep 300 &

S'il est déjà en cours d'exécution, votre seule option est de l'arrêter, puis de le mettre en arrière-plan.

bahamat
la source
Entre appuyer sur ctrl + z et exécuter bg, il y a un délai pendant lequel l'application est complètement suspendue, ce que je ne veux pas. Il n'y a donc aucun moyen de l'envoyer en arrière - plan immédiatement ?
trusktr
1
Nan. Comme l'a dit Giles, il faut à la fois le shell et le terminal. Vous devez informer chacun.
bahamat