質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
HTTP

HTTP(Hypertext Transfer Protocol)とはweb上でHTML等のコンテンツを交換するために使われるアプリケーション層の通信プロトコルです。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

Q&A

解決済

2回答

5897閲覧

python HTTPServerで使用したポートがkillできない

Leonhqrt

総合スコア17

HTTP

HTTP(Hypertext Transfer Protocol)とはweb上でHTML等のコンテンツを交換するために使われるアプリケーション層の通信プロトコルです。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

0グッド

0クリップ

投稿2017/09/13 05:29

この度、私はネットで見つけたコードを参考にして以下のコードを実行しました。

callBackWebServer.py

1#これはモジュールです。 2#!/usr/bin/env python 3 4import requests 5from BaseHTTPServer import HTTPServer 6from BaseHTTPServer import BaseHTTPRequestHandler 7import urlparse 8 9def start(port, callback): 10 def handler(*args): 11 CallbackServer(callback, *args) 12 server = HTTPServer(('', int(port)), handler) 13 server.serve_forever() 14 15 16class CallbackServer(BaseHTTPRequestHandler): 17 def __init__(self, callback, *args): 18 self.callback = callback 19 BaseHTTPRequestHandler.__init__(self, *args) 20 21 def do_GET(self): 22 parsed_path = urlparse.urlparse(self.path) 23 query = parsed_path.query 24 self.send_response(200) 25 self.end_headers() 26 result = self.callback(query) 27 message = '\r\n'.join(result) 28 self.wfile.write(message) 29 return

requests.py

1#!/usr/bin/env python 2# conding:utf-8 3 4import requests 5import sys 6import callBackWebServer 7 8def callback_method(query): 9 return ['Hello', 'World', 'with', query] 10 11if __name__ == '__main__': 12 port = sys.argv[1] 13 callBackWebServer.start(port, callback_method)

その後、

python requests.py 23456

をターミナルで起動すると無事にローカルにhtmlリクエストを送信させることができたのですが、この直後に問題が発生しました。Ctrl+cで処理を終了させた後、
もう一度

python requests.py 23456

とコマンドを入力すると、

socket.error: [Errno 48] Address already in use

と、先ほど使用したポートが解放してないためにエラーが出てしまいました。

本当は、

server = HTTPServer(('', int(port)), handler) server.serve_forever()

の部分を

with HTTPServer(('', int(port)), handler) as server: server.serve_forever

と書くべきだったのかもしれません。

そこでプロセスを終了させるために、

ps -auxf | grep python

で調べた結果、

user 1624 0.0 0.5 8328 4896 pts/0 T ***** 0:00 \_ python user 2744 0.0 0.2 4712 1968 pts/0 S+ ***** 0:00 \_ grep --color=auto python

と出力されたため、

kill 1624

と実行させましたが、上記のエラーは改善されず、ポートが使用中のままになっています。
どなたか、この解決方法を教えていただけないでしょうか。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

unau

2017/09/13 05:34

kill 1624 でプロセスは殺せましたか (もういちど ps で調べる)。
Leonhqrt

2017/09/13 05:41

いいえ。プロセスは殺せませんでした。psコマンドでkillコマンドを打つ前と同じように表示されます
guest

回答2

0

ベストアンサー

kill コマンドは、名前に反して「プロセスを kill する」コマンドではなく、「プロセス (やプロセスグループ) に signal を送る」コマンドです。signal にはいくつか種類があり、kill -l で一覧が見られます。
で、signal の種類を指定して特定のプロセスに signal を送るわけですが、種類を指定しない場合は、SIGTERM が送られます。「終わりにしてね」くらいの意味です。

$ kill 12345 $ kill -15 12345 $ kill -TERM 12345

は、いずれもプロセス ID 12345 のプロセスに SIGTERM を送るコマンドです。
もっと強い、「終わらせてやる」くらいの意味のシグナルには SIGINT などがあります。もっともっと強いのが、「殺してやる」という SIGKILL です。kill -KILL 123345 でもいいのですが、SIGKILL の番号が 9 なので、強制的にプロセスを殺す場合、普通は次のようにします。

$ kill -9 12345

投稿2017/09/13 12:34

編集2017/09/13 13:40
unau

総合スコア2468

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Leonhqrt

2017/09/13 13:13

無事、プロセスを強制的に終了させることができました。 とても勉強になりました。ありがとうございました
guest

0

kill -9 1624

投稿2017/09/13 09:08

kero1209

総合スコア431

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問