web-dev-qa-db-fra.com

Comment puis-je arrêter un python simpleHTTPserver?

Donc, j'essaie d'apprendre d3, et le wiki a suggéré que

Pour afficher les exemples localement, vous devez disposer d'un serveur Web local. Tout serveur Web fonctionnera. Par exemple, vous pouvez exécuter le serveur intégré de Python:

python -m SimpleHTTPServer 8888 &

Génial ... Seulement maintenant, j'ai un serveur en cours d'exécution ... mais à un moment donné, je pense que je devrais probablement arrêter de nouveau.

Existe-t-il un meilleur moyen de le désactiver que d'utiliser kill <pid>? Cela ressemble à une sorte de gros marteau pour un petit travail.

(J'utilise Mac OS 10.6.8 (Snow Leopard))

FWIW: ctrl+c donne environ 10 lignes de trace, se plaignant d’être interrompues.

kill -3 <pid> donne un avertissement du Finder dans une fenêtre séparée 'Python se ferme inopinément'.

Le défaut kill <pid> et kill -15 <pid> sont relativement propres (et simples).

60
Suz

Vous envoyez simplement des signaux aux processus. kill est une commande pour envoyer ces signaux.

La commande clavier Ctrl + C ( + C) envoie un SIGINT, kill -9 envoie un SIGKILL et kill -15 envoie un SIGTERM.

Quel signal voulez-vous envoyer à votre serveur pour y mettre fin?

37
xbello

si vous avez démarré le serveur avec

python -m SimpleHTTPServer 8888 

vous pouvez ensuite appuyer sur ctrl + c pour arrêter le serveur.

Mais si vous avez démarré le serveur avec

python -m SimpleHTTPServer 8888 &

ou

python -m SimpleHTTPServer 8888 & disown

il faut d'abord voir la liste pour tuer le processus,

commande d'exécution

ps

ou

ps aux | less

il va vous montrer un processus en cours comme ça ..

PID TTY          TIME CMD
7247 pts/3     00:00:00 python
7360 pts/3     00:00:00 ps
23606 pts/3    00:00:00 bash

vous pouvez obtenir le PID à partir d'ici. et tuez ce processus en exécutant cette commande ..

kill -9 7247

ici 7247 est le python id.

Aussi, pour une raison quelconque, si le port est toujours ouvert, vous pouvez l'éteindre avec cette commande

fuser -k 8888/tcp

ici 8888 est le port tcp ouvert par python.

J'espère que c'est clair maintenant.

30
codersaif

ou vous pouvez simplement faire kill %1, qui supprimera le premier travail placé en arrière-plan

14
Lachezar
MYPORT=8888; 
kill -9 `ps -ef |grep SimpleHTTPServer |grep $MYPORT |awk '{print $2}'`

C'est ça !!

Expliquez la ligne de commande:

  • ps -ef: liste tous les processus.

  • grep SimpleHTTPServer: processus de filtrage appartenant à "SimpleHTTPServer"

  • grep $MYPORT: le nouveau filtrage appartient à "SimpleHTTPServer" où le port est MYPORT (.i.e: MYPORT = 8888)

  • awk '{print $2}': affiche la deuxième colonne du résultat qui correspond au PID (ID de processus)

  • kill -9 <PID>: Forcer le processus de destruction avec le PID approprié.

13
Abdennour TOUMI

Il s'avère qu'il y a un arrêt, mais cela doit être lancé à partir d'un autre thread.

Cette solution a fonctionné pour moi: https://stackoverflow.com/a/22533929/573216

6
dirkk0

Lorsque vous exécutez un programme en arrière-plan (en ajoutant un & après), par exemple:

python -m SimpleHTTPServer 8888 &

Si la fenêtre du terminal est toujours ouverte, vous pouvez faire:

jobs

Pour obtenir une liste de tous les travaux en arrière-plan du processus en cours d'exécution du shell.

Cela pourrait ressembler à ceci:

$ jobs
[1]+  Running                 python -m SimpleHTTPServer 8888 &

Pour tuer un travail, vous pouvez soit faire kill %1 tuer le travail "[1]", ou bien faire fg %1 pour placer le travail au premier plan (fg), puis utilisez ctrl-c pour le supprimer. (Il suffit d'entrer fg pour placer le dernier processus d'arrière-plan au premier plan).

En ce qui concerne SimpleHTTPServer, il semble que kill %1 est meilleur que fg + ctrl-c. Au moins, il ne proteste pas avec la commande kill.

Ce qui précède a été testé sous Mac OS, mais autant que je sache, il fonctionne de la même manière sous Linux.

pdate: Pour que cela fonctionne, le serveur Web doit être démarré directement à partir de la ligne de commande (mot à mot le premier extrait de code). Utiliser un script pour le lancer mettra le processus hors de portée de jobs.

4
Erk

Cela semble excessif, mais vous pouvez utiliser superviseur pour démarrer et arrêter votre simpleHttpserver, et le gérer complètement en tant que service.

Ou simplement l'exécuter au premier plan comme suggéré et le tuer avec le contrôle c

3
dm03514

Frapper ctrl + c une fois (attendre traceback), puis frapper ctrl + c a encore fait le tour pour moi :)

0
small_data88