Placer le travail en arrière-plan sans gel

Disons que vous commencez le travail comme ça

foo 

et puis désirez que vous vouliez le placer en arrière-plan. Taper Ctrl + Z et ensuite b g fait l'astuce mais va geler foo entre Ctrl + Z et b g . Comment puis-je placer foo dans l'arrière-plan sans le gel d'abord?

L'envoi d'une application depuis le premier plan vers l'arrière-plan requirejs 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 process de premier plan. Le shell ne peut pas le faire seul, car le terminal doit traiter la pression des touches (le shell n'est pas au premier plan, il ne peut donc pas recevoir de pression de touche).

J'ai une configuration zsh où je peux appuyer deux fois sur Ctrl + Z en succession rapide; la première pression interrompt le process et la deuxième pression la reprend en arrière-plan. Je ne sais pas comment le porter à bash.

Si vous utilisez un émulateur de terminal qui vous permet d'injecter des frappes, vous pouvez injecter ^Zbg^M (en utilisant la notation ^ pour les caractères de contrôle). Par exemple, avec un émulateur de terminal X11, exécutez xdotool --window 1234 Ctrl_L+Z bg Return où 1234 est l'ID de window de l'émulateur de terminal. Avec Screen, exécutez screen -S foo -p 12 -X stuff $'\032bg\r'foo est le nom de la session d'écran et 12 est l'ID de la window.

Techniquement foo fonctionne déjà en arrière-plan. Vous pouvez démarrer une deuxième session de terminal et la première continuera à exécuter foo pendant que vous faites d'autres choses.

Dans X, cela implique simplement de démarrer une deuxième application de terminal ou d'ouvrir un autre onglet si votre émulateur de terminal de choix a de telles fonctionnalités.

Sur la console, si vous ne l'aviez pas prévu, vous devez passer à un autre terminal virtuel et vous reconnecter.

Si vous utilisez un multiplexeur de terminal comme screen ou tmux vous pouvez démarrer une autre session à l'intérieur. Par exemple, dans l'écran, ceci est fait en utilisant Ctrl + A immédiatement suivi de Ctrl + C. Pour basculer entre eux, utilisez Ca Cn et Ca Cp pour aller et venir entre les sessions du terminal.

L'ajout d'un signe & après la command ( foo & ) le fera immédiatement. Mais je crois qu'il n'y a aucun moyen, dans une configuration terminal / shell standard , de fonder quelque chose immédiatement une fois qu'il est à l'avant-plan.

Si votre frappe n'est pas assez rapide pour le cas, exécutez kill -s SIGSTOP 1023 && kill -s SIGCONT 1023 partir d'un autre shell, en supposant 1023 comme PID cible.

AVERTISSEMENT: Comme Ruslan le savait probablement, cette séquence redémarre réellement le travail si rapidement que bash ne le remarque pas.