Placer le travail en arrière-plan sans geler

9

Dis que tu commences le travail comme ça

foo

puis désire que vous vouliez le placer en arrière-plan. Taper Ctrl+ Zpuis bgfait l'affaire mais gèle fooentre Ctrl+ Zet bg. Comment puis-je placer foo en arrière-plan sans le geler au préalable?

user877329
la source
7
Quel est le cas d'utilisation? Pourquoi est-ce un problème que le processus se bloque pendant une courte période?
l0b0

Réponses:

4

Fonctionne foodéjà techniquement en arrière-plan. Vous pouvez démarrer une deuxième session de terminal et la première continuera de s'exécuter foopendant que vous effectuez d'autres tâches.

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

Sur la console, si vous ne l'avez pas prévu, vous devez basculer vers un autre terminal virtuel et vous reconnecter.

Si vous utilisez un terminal multiplexeur comme screenou tmuxvous pouvez démarrer une autre session en son sein. Par exemple, dans l'écran, cela se fait en utilisant Ctrl+ Aimmédiatement suivi de Ctrl+ C. Pour basculer entre eux, utilisez Ca Cn et Ca Cp pour aller et venir entre les sessions terminales.

un CVn
la source
Autrement dit, ce n'est pas possible dans bash.
user877329
1
Cette réponse semble reposer sur une mauvaise compréhension du concept de travail de fond. Un terminal a un attribut "groupe de processus de premier plan", généralement défini par le shell, ce qui permet aux processus de ce groupe de lire à partir du terminal et de recevoir des signaux liés au terminal comme SIGINT. Tous les processus en cours d'exécution sur le terminal qui ne sont pas dans le groupe de processus de premier plan sont des processus d'arrière-plan. Lorsque vous créez un nouveau terminal, le travail de premier plan du terminal d'origine est toujours le travail de premier plan sur ce terminal, même si vous ne le regardez pas.
@ WumpusQ.Wumbley Le point de ma réponse est que la plupart (tous?) Les systèmes qui peuvent exécuter bash sont multitâches par leur nature même. Sur un tel système, même si un processus a, par exemple, un focus d'entrée, il n'y a rien de fondamentalement "de premier plan" dans le processus lui-même; foo lui-même (en l'absence de vérification spécifique, qui, je suppose, à l'état sauvage est quelque part entre rare et inexistant) ne se soucie pas de savoir s'il s'exécute dans la fenêtre la plus haute ou même s'il y a quelque chose qui affiche sa sortie.
un CVn du
1
mon point est que lorsque la question mentionne spécifiquement les mots "background" et "job" - qui sont tous deux des termes techniques avec des significations définies par le cadre du groupe de processus POSIX - ainsi que les mécanismes de Ctrl-Z et bg, tous deux opérez sur des groupes de processus - et votre réponse suggère de ne pas utiliser du tout la fonctionnalité de groupe de processus, et vous utilisez le mot «arrière-plan» d'une manière qui ne correspond pas à sa définition réelle - vous n'adaptez pas votre réponse à la question. Et pour commencer avec "Techniquement foofonctionne déjà en arrière-plan" ... juste ... Non. Techniquement.
@ WumpusQ.Wumbley D'une manière ou d'une autre, je ne pense pas que l'OP ait lu le standard POSIX et pensé "hmm, j'aimerais l'utiliser, mais j'ai déjà commencé fooalors maintenant que dois-je faire?". Si vous pensez que cette réponse (ou d'autres réponses) n'est pas utile pour répondre à la question, je vous encourage à exercer vos privilèges de vote ainsi qu'à laisser une réponse de votre propre réponse à la question sous ce que vous pensez être l'angle correct, plutôt que argumenter sur l' une des réponses laissées sur la question. Peut-être que vous pensez par exemple que la réponse de l0b0 est meilleure, mais ma réponse offre un moyen de faire au moins à peu près ce que l'OP veut.
un CVn
3

L'ajout d'un &signe après la commande ( foo &) le mettra immédiatement en arrière-plan. Mais je crois qu'il n'y a aucun moyen, dans une configuration standard de terminal / shell, d'arrière-plan quelque chose immédiatement une fois qu'il est au premier plan.

l0b0
la source
3

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

J'ai une configuration zsh où je peux appuyer sur Ctrl+ Zdeux fois de suite rapidement; la première presse suspend le processus et la deuxième presse le reprend en arrière-plan. Je ne sais pas comment le porter sur bash.

Si vous utilisez un émulateur de terminal qui vous permet d'injecter des touches, 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 b g Returnoù 1234 est l'ID de fenêtre de l'émulateur de terminal. Avec Screen, exécutez screen -S foo -p 12 -X stuff $'\032bg\r'fooest le nom de la session d'écran et 12l'ID de la fenêtre.

Gilles 'SO- arrête d'être méchant'
la source
2

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

AVIS DE NON-RESPONSABILITÉ: Comme Ruslan le savait probablement, cette séquence redémarre réellement le travail si rapidement bashqu'il ne le remarque pas.

41754
la source
Comment placerait-il le travail en arrière-plan?
Ruslan
À quelle vitesse est rapide?
user877329