Il y a des emplois arrêtés (à la sortie de bash)

158

Je reçois le message There are stopped jobs.lorsque j'essaie parfois de sortir d'un shell bash. Voici un scénario reproductible dans Python 2.x:

  • ctrl+ cest traité par l'interprète comme une exception.
  • ctrl+ z'arrête' le processus.
  • ctrl+ dquitte python pour de vrai.

Voici quelques sorties de terminaux du monde réel:

example_user@example_server:~$ python
Python 2.7.3 (default, Sep 26 2013, 20:03:06) 
[GCC 4.6.3] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> 

ctrl+z

[1]+  Stopped                 python
example_user@example_server:~$ exit
logout
There are stopped jobs.

Bash n'est pas sorti, je dois exitencore sortir du shell bash.

  • Q: Qu'est-ce qu'un "travail arrêté" ou qu'est-ce que cela signifie?
  • Q: Peut-on reprendre un processus arrêté?
  • Q: Le premier exitsupprime- t-il les travaux arrêtés?
  • Q: Y a - t-il un moyen de sortir du shell la première fois? (sans entrer exitdeux fois)
ThorSummoner
la source
Ctrl + Maj + \ fera également sortir python.
ThorSummoner

Réponses:

206

Un travail arrêté est un travail qui a été temporairement placé en arrière-plan et qui n'est plus en cours d'exécution mais qui utilise toujours des ressources (par exemple, la mémoire système). Ce travail n'étant pas associé au terminal actuel, il ne peut pas générer de sortie et ne reçoit aucune entrée de l'utilisateur.

Vous pouvez voir les tâches en cours d’exécution à l’aide de la jobscommande intégrée de bash, probablement d’autres shells. Exemple:

user@mysystem:~$ jobs
[1] + Stopped                python
user@mysystem:~$ 

Vous pouvez reprendre un travail arrêté en utilisant la fgcommande intégrée basun (premier plan). Si vous avez plusieurs commandes qui ont été arrêtées, vous devez spécifier celle à reprendre en transmettant le numéro de jobpec sur la ligne de commande fg. Si un seul programme est arrêté, vous pouvez utiliser fgseul:

user@mysystem:~$ fg 1
python

À ce stade, vous êtes de retour dans l'interpréteur python et pouvez quitter en utilisant control-D.

Réciproquement, vous pouvez killutiliser la commande avec soit Jobspec ou PID. Par exemple:

user@mysystem:~$ ps
  PID TTY          TIME CMD
16174 pts/3    00:00:00 bash
17781 pts/3    00:00:00 python
18276 pts/3    00:00:00 ps
user@mysystem:~$ kill 17781
[1]+  Killed                  python
user@mysystem:~$ 

Pour utiliser le numéro de travail, faites précéder le nombre par la touche pourcentage (%):

user@mysystem:~$ kill %1
[1]+  Terminated              python

Si vous émettez une commande de sortie avec des tâches arrêtées, l'avertissement que vous avez vu sera donné. Les travaux seront laissés en cours d'exécution pour la sécurité. C'est pour vous assurer que vous savez que vous essayez de supprimer des emplois que vous auriez peut-être oubliés. La deuxième fois que vous utilisez la commande exit, les travaux sont terminés et le shell se ferme. Cela peut entraîner des problèmes pour certains programmes qui ne sont pas conçus pour être supprimés de cette manière.

En bash, il semble que vous puissiez utiliser la logoutcommande qui va tuer les processus arrêtés et sortir. Cela peut entraîner des résultats indésirables.

Notez également que certains programmes peuvent ne pas être fermés de cette manière et que votre système risque de se retrouver avec de nombreux processus orphelins utilisant beaucoup de ressources si vous prenez l'habitude de le faire.

Notez que vous pouvez créer un processus d’arrière-plan qui s’arrêtera s’il nécessite l’intervention de l’utilisateur:

user@mysystem:~$ python &
[1] 19028
user@mysystem:~$ jobs
[1]+  Stopped                 python

Vous pouvez reprendre et supprimer ces travaux de la même manière que les travaux que vous aviez arrêtés avec l' Ctrl-zinterruption.

OldTimer
la source
4
Je voudrais chipoter avec votre deuxième phrase. Il devrait indiquer: "Etant donné que le travail est arrêté , il ne peut prendre aucune mesure - E / S de fichier, E / S réseau, E / S de terminal ou tout autre traitement."
Scott
2
Cela m'aide beaucoup.
Shellbye
Excellent post une grande aide à tout le monde!
George Udosen
18

Q: Qu'est-ce qu'un "travail arrêté" ou qu'est-ce que cela signifie?

Un travail arrêté désigne un processus qui a reçu un signal d'arrêt ( SIGSTOP/ SIGTSTP) du clavier (caractère de suspension Ctrl-Z), d'une commande (par exemple kill -STOP [PID]) ou d'un autre processus (par exemple, un noyau lorsque le système manque de ressources) et qu'il est en état de pause, il indique donc au système d'arrêter / de suspendre un processus afin qu'il ne fasse aucune exécution / traitement.

Emploi shell actifs peuvent être classés par: jobs.

Q: Un processus interrompu peut-il être repris?

Le processus arrêté ne reprendra son exécution que si le SIGCONTsignal lui est envoyé . Ceci peut être réalisé soit par fg(ou fg ID) qui déplacera la tâche au premier plan, la transformant en tâche en cours, bgà la poursuivre en arrière-plan, ou en envoyant un SIGCONTsignal (par exemple kill -CONT [PID]).

Q: La première sortie tue-t-elle les travaux arrêtés?

Pour la première fois lorsque vous tapez exit/ logoutou appuyez sur Ctrl-D, le shell imprime un message d'avertissement concernant les tâches actives en cours associées à votre terminal. Par conséquent, il ne vous tuera pas sans votre autorisation en confirmant l'action une seconde fois. Si l' checkjobsoption est activée ( shopt -s checkjobs), il peut également répertorier les travaux avec leur statut.

Q: Y a-t-il un moyen de sortir du shell la première fois? (sans entrer deux fois en sortie)

Vous pouvez appuyer Ctrl+Ddeux fois sur cette touche ou la maintenir plus longtemps, cela permettra de quitter rapidement le silence, ce qui supprimera les tâches actuellement arrêtées / en cours.

Vous pouvez également les désavouer ( disown) de les laisser ou les tuer manuellement: kill $(jobs -p).

Kenorb
la source