web-dev-qa-db-fra.com

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

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

  • ctrl+c est traité par l'interprète comme une exception.
  • ctrl+z "arrête" le processus.
  • ctrl+d quitte python pour les réels.

Voici une sortie de terminal réelle:

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 exit à nouveau pour quitter le shell bash.

  • Q: Qu'est-ce qu'un "travail interrompu", ou qu'est-ce que cela signifie?
  • Q: Un processus arrêté peut-il être repris?
  • Q: Le premier exit tue-t-il les travaux arrêtés?
  • Q: Existe-t-il un moyen de quitter le Shell la première fois? (sans entrer deux fois exit)
168
ThorSummoner

Un travail arrêté est un travail qui a été temporairement mis en arrière-plan et qui n'est plus en cours d'exécution, mais qui utilise toujours des ressources (c'est-à-dire la mémoire système). Étant donné que ce travail n'est pas connecté au terminal actuel, il ne peut pas produire de sortie et ne reçoit pas d'entrée de l'utilisateur.

Vous pouvez voir les tâches que vous exécutez en utilisant la commande intégrée jobs dans bash, probablement aussi d'autres shells. Exemple:

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

Vous pouvez reprendre un travail arrêté à l'aide de la commande intégrée bash fg (premier plan). Si plusieurs commandes ont été arrêtées, vous devez spécifier celle à reprendre en passant le numéro de jobspec sur la ligne de commande avec fg. Si un seul programme est arrêté, vous pouvez utiliser fg seul:

user@mysystem:~$ fg 1
python

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

Inversement, vous pouvez kill la commande avec son 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 jobspec, faites précéder le nombre de la touche pourcentage (%):

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

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

En bash, il semble que vous pouvez utiliser la commande logout qui tuera les processus arrêtés et quittera. Cela peut entraîner des résultats indésirables.

Notez également que certains programmes peuvent ne pas se terminer lorsqu'ils sont terminés de cette manière, et votre système pourrait se retrouver avec de nombreux processus orphelins utilisant des ressources si vous avez 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 une entrée 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 vous avez fait les travaux que vous avez arrêtés avec le Ctrl-z interrompre.

221
OldTimer

Q: Qu'est-ce qu'un "emploi interrompu" ou qu'est-ce que cela signifie?

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

Les travaux Active Shell peuvent être répertoriés par: jobs.

Q: Un processus arrêté peut-il être repris?

Le processus arrêté ne reprendra son exécution que s'il reçoit le signal SIGCONT. Ceci peut être réalisé soit par fg (ou fg ID) Qui déplacera le travail au premier plan pour en faire le travail courant, bg pour le continuer en arrière-plan, ou par envoi d'un signal SIGCONT (par exemple kill -CONT [PID]).

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

Première fois que vous tapez exit/logout ou appuyez sur Ctrl-D, le Shell imprime un message d'avertissement sur les travaux actifs en cours qui sont associés à votre terminal, il ne vous tuera donc pas ceux sans votre permission en confirmant l'action une deuxième fois. Si l'option checkjobs est activée (shopt -s checkjobs), Elle peut également répertorier les travaux avec leurs statuts.

Q: Existe-t-il un moyen de quitter le Shell la première fois? (sans entrer deux fois en sortie)

Vous pouvez appuyer sur Ctrl+D deux fois ou maintenez-le plus longtemps, cela quittera Shell silencieusement rapidement, tuant les tâches de Shel en cours d'arrêt/en cours d'exécution.

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

19
kenorb