Cela devrait être vrai de tout shell avec contrôle de travail, que vous pouvez prendre pour acquis (pour la plupart) à moins de traiter avec un shell vraiment ancien. C'est le standard POSIX , donc dash
supporte même le contrôle du travail (lorsqu'il est exécuté de manière interactive ou avec -m
).
Interactif
- Ctrl+ zsuspendra le programme actuellement mis en avant
bg
Contiendra le dernier programme suspendu
(à utiliser bg %2
avec le numéro du travail que vous pouvez vérifier jobs
)
fg
mettra en avant le programme suspendu le plus récemment
Dans zsh
, vous pouvez écrire une liaison de clé à 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 astucieux de procéder implicitement bg
à la suspension, mais cela semble peu judicieux; du moins pour moi, la majorité de mon Ctrl+ zusage est dû au fait que Ctrl+ cne parvient pas à éclater; Je veux suivre cela avec, par exemple, kill %1
plutôt que bg
, et je ne veux certainement pas laisser tomber le meurtre! (Cette logique s'étend également à la raison pour laquelle je n'utilise plus cette liaison de clé: si je martèle Ctrl+ zpour 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 du shell (ou un utilisateur différent, y compris parfois des sudo
commandes), vous ne pourrez probablement pas utiliser de numéro 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 à partir du même shell,, jobs -l
ou $!
) et vous pouvez ensuite exécuter:
kill -STOP $PID # suspend
kill -CONT $PID # continue (resume)
Si vous ne connaissez pas l'ID du processus et que vous ne craignez pas de suspendre son nom par d'autres instances du processus, vous pouvez transmettre des signaux à l'un de ces éléments:
killall -STOP program_name
pkill -STOP program_name
pkill -f -STOP program_name_or_args
Un CONT
signal envoyé à un programme arrêté avec Ctrl+ z(et non bg
'd) reprendra sa progression (au premier plan), comme si vous y étiez fg
.
Re: erreur standard
La modification de cette question concerne l'erreur standard:
Le processus est envoyé à stderr, comment dois-je exécuter la commande fg <jobid>
pendant que le processus est envoyé au terminal?
À moins que le travail en question ne contienne des composants avec arrière-plan (ou que le travail tout entier soit peut-être via kill -CONT
, par exemple ), vous ne devriez pas voir la sortie tant qu'elle est suspendue.
S'il émet toujours des données (que ce soit sur la sortie standard ou sur l'erreur standard), votre terminal sera visuellement surchargé visuellement, mais toute cette sortie sera ignorée car elle ne fait pas partie de votre entrée. Cela peut rendre plus difficile le fait de savoir que vous n'avez pas saisi de fautes de frappe, mais la frappe (à l'aveugle) fg
Enterdevrait suffire (à moins que vous n'ayez plusieurs travaux et que celui en question ne soit pas le plus récent, auquel cas vous aurez effectivement besoin du descripteur de travail. ).
Si vous avez besoin de trouver le descripteur de travail, utilisez un autre terminal pour lui envoyer le STOP
signal via les méthodes non interactives ci-dessus. Cela devrait libérer votre affichage (peut-être frappé Enterplusieurs fois ou exécuté clear
ou Ctrl+ L) afin que vous puissiez ensuite jobs
rechercher le descripteur de travail, puis exécuter fg %N
où se N
trouve ce nombre.