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?
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 .
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
).
bg
affichera le dernier programme suspendubg %2
avec le numéro du travail, que vous pouvez vérifier avec jobs
)fg
mettra en avant-plan le dernier programme suspenduDans 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!)
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
.
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) fg
Enter 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 %N
où N
est ce nombre.
Tapez fg
pour le mettre au premier plan.
jobs
fg
; par exemple.: fg %4
CTRL Z
Suspendrebg %4
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