web-dev-qa-db-fra.com

Comment suspendre et mettre un processus d'arrière-plan au premier plan

J'ai un processus en cours d'exécution au premier plan. J'ai suspendu par Ctrl+Z, puis reprenez son exécution en arrière-plan par bg <jobid>.

Je me demande comment suspendre un processus en cours d'exécution en arrière-plan?

Comment mettre un processus d'arrière-plan au premier plan?

Modifier:

Le processus sort vers stderr, alors comment dois-je lancer la commande fg <jobid> pendant la sortie du processus vers le terminal?

185
Tim

Comme l'a dit Tim, tapez fg pour ramener le dernier processus au premier plan.

Si plusieurs processus s'exécutent en arrière-plan, procédez comme suit:

$ jobs
[1]   Stopped                 vim
[2]-  Stopped                 bash
[3]+  Stopped                 vim 23

fg %3 pour apporter le vim 23 retourne au premier plan.

Pour suspendre le processus en cours d'exécution en arrière-plan, utilisez:

kill -STOP %job_id

Le signal SIGSTOP arrête (met en pause) un processus essentiellement de la même manière Ctrl+Z Est-ce que.

exemple: kill -STOP %3.

sources: Comment envoyer des signaux aux processus sous Linux et Unix et Comment gérer les tâches d'arrière-plan et de premier plan .

237
fromnaboo

Cela devrait être vrai pour tout Shell avec contrôle des tâches, que (pour la plupart) vous pouvez tenir pour acquis à moins d'avoir affaire à un Shell vraiment ancien. C'est dans la norme POSIX , donc même dash prend en charge le contrôle des travaux (lorsqu'il est exécuté de manière interactive ou avec -m).

Interactif

  • Ctrl+z suspendra le programme actuellement mis en avant
  • bg affichera le dernier programme suspendu
    (utilisation bg %2 avec le numéro du travail, que vous pouvez vérifier avec jobs)
  • fg mettra en avant-plan le dernier programme suspendu

Dans zsh, vous pouvez écrire une liaison de clé pour exécuter implicitement fg à partir de l'invite via un autre Ctrl+z:

_zsh_cli_fg() { fg; }
zle -N _zsh_cli_fg
bindkey '^Z' _zsh_cli_fg

Il existe probablement aussi un moyen intelligent d'exécuter implicitement bg lors de la suspension, mais cela semble imprudent; au moins pour moi, la majorité de mes Ctrl+z l'utilisation est parce que Ctrl+c ne parvient pas à éclater; Je veux suivre cela avec par exemple kill %1 plutôt que bg, et je ne veux certainement pas par défaut tuer! (Cette logique explique également pourquoi je n'utilise plus ce raccourci clavier: si je martèle Ctrl+z pour arrêter un processus, la dernière chose que je veux qu'il fasse est de reprendre!)

Non interactif

Si vous êtes dans une autre instance de Shell (ou un utilisateur différent, incluant parfois des commandes Sudo), vous ne pourrez probablement pas utiliser les numéros de travail.

Vous pouvez toujours agir sur un autre processus une fois que vous connaissez son ID de processus (PID). Vous pouvez obtenir le PID avec pgrep …, ou ps aux |grep … (ou du même shell, jobs -l, ou $!) et vous pouvez alors exécuter:

kill -STOP $PID  # suspend
kill -CONT $PID  # continue (resume)

Si vous ne connaissez pas l'ID de processus et que vous n'êtes pas inquiet de suspendre d'autres instances du processus par leur nom, vous pouvez transmettre des signaux à l'une des suivantes:

killall -STOP program_name
pkill -STOP program_name
pkill -f -STOP program_name_or_args

Un signal CONT à un programme arrêté avec Ctrl+z (et non bg 'd) reprendra sa progression (au premier plan), comme si vous deviez fg.

Re: Erreur standard

La modification de cette question concerne l'erreur standard:

Le processus sort vers stderr, alors comment dois-je lancer la commande fg <jobid> pendant la sortie du processus vers le terminal?

À moins que le travail en question ne comporte des composants en arrière-plan (ou que l'ensemble du travail soit en arrière-plan, peut-être via kill -CONT), vous ne devriez pas réellement voir la sortie pendant qu'elle est suspendue.

S'il émet toujours des données (que ce soit vers une sortie standard ou une erreur standard), cela rendra certainement votre terminal visuellement encombré, mais toute cette sortie sera ignorée car elle ne fait pas partie de votre entrée. Cela pourrait rendre plus difficile de savoir que vous n'avez saisi aucune faute de frappe, mais en tapant (aveuglément) fgEnter devrait suffire (sauf si vous avez plusieurs emplois et que celui en question n'est pas le plus récent, auquel cas vous aurez en effet besoin du descripteur de travail).

Si vous avez besoin de trouver le descripteur de travail, utilisez un autre terminal pour lui envoyer le signal STOP via les méthodes non interactives ci-dessus. Cela devrait libérer votre affichage (peut-être appuyer sur Enter plusieurs fois ou exécutez clear ou Ctrl+L) afin que vous puissiez ensuite exécuter jobs pour trouver le descripteur de travail, puis exécuter fg %NN est ce nombre.

36
Adam Katz

Tapez fg pour le mettre au premier plan.

11
Tim
  1. lister les travaux avec la commande jobs
  2. Mettez votre travail cible au premier plan avec fg; par exemple.: fg %4
  3. Frappé CTRL Z Suspendre
  4. Pour le lancer en arrière-plan, utilisez bg; par exemple.: bg %4
1
kmiklas

La fin d'un processus peut se faire de plusieurs manières différentes. Souvent, à partir d'une commande sur console, l'envoi d'un Ctrlc la frappe (le caractère d'interruption par défaut) quittera la commande. Cela fonctionne lorsque le processus s'exécute en mode de premier plan.

Si un processus s'exécute en arrière-plan, vous devez d'abord obtenir son ID de travail à l'aide de la commande ps, puis vous pouvez utiliser la commande kill pour tuer le processus comme suit:

$ps -f
UID      PID  PPID C STIME    TTY   TIME CMD
amrood   6738 3662 0 10:23:03 pts/6 0:00 first_one
amrood   6739 3662 0 10:22:54 pts/6 0:00 second_one
amrood   3662 3657 0 08:10:53 pts/6 0:00 -ksh
amrood   6892 3662 4 10:51:50 pts/6 0:00 ps -f
$kill 6738
Terminated

Ici, la commande kill mettrait fin à first_one processus. Si un processus ignore une commande régulière kill, vous pouvez utiliser kill -9 suivi de l'ID de processus comme suit:

$kill -9 6738
Terminated
0
Lakshmi