次のスクリプトを実行しています...
import socket
import sys
from collections import OrderedDict
from subprocess import check_output
from threading import Thread
[...]
class IpCheck(Thread):
RECEIVED_PACKAGES_RE = re.compile(r'(\d+) received')
def __init__(self, ip):
Thread.__init__(self)
self.ip = ip
self.result = None
def run(self):
match = self.RECEIVED_PACKAGES_RE.search(
check_output(['ping', '-q', '-c2', '-W1', self.ip])
)
successful_ping_count = int(match.group(1)) if match else 0
if successful_ping_count == 0:
self.result = 'no response'
Elif successful_ping_count == 1:
self.result = 'alive, but 50% package loss'
Elif successful_ping_count == 2:
self.result = check_snmp(self.ip)
else:
assert False
[...]
...エラーになります:
CalledProcessError:コマンド '[ping'、 '-q'、 '-c2'、 '-W1'、'10 .81.3.80 ']'がゼロ以外の終了ステータス1を返しました
check_output
に「stderr = STDOUT」を追加しても、有用なフィードバックは生成されませんでした。
トラブルシューティングを行うために、エラーに関する詳細情報を入手するにはどうすればよいですか?
subprocess.check_output ゼロ以外の終了コードで CalledProcessError が発生し、ping
は何かが間違っている場合(たとえば、不明なドメイン名、またはサイトがダウンしている、またはサイトが何らかの理由でICMPをブロックしている、またはインターネット接続がダウンしている)。
出力コードと終了コードの両方を調べたい場合は、 subprocess.Popen を使用します。
import subprocess
import sys
site = sys.argv[1]
ping_count = 4
process = subprocess.Popen(['ping', site, '-c', str(ping_count)],
stdout=subprocess.PIPE,
stderr=subprocess.STDOUT)
returncode = process.wait()
print('ping returned {0}'.format(returncode))
print(process.stdout.read())
例:
$ python ping.py google.com <-- ping successful
ping returned 0
PING google.com (195.64.213.27) 56(84) bytes of data.
64 bytes from cache.google.com (195.64.213.27): icmp_seq=1 ttl=57 time=59.8 ms
64 bytes from cache.google.com (195.64.213.27): icmp_seq=2 ttl=57 time=2.43 ms
64 bytes from cache.google.com (195.64.213.27): icmp_seq=3 ttl=57 time=77.0 ms
64 bytes from cache.google.com (195.64.213.27): icmp_seq=4 ttl=57 time=43.8 ms
--- google.com ping statistics ---
4 packets transmitted, 4 received, 0% packet loss, time 3004ms
rtt min/avg/max/mdev = 2.439/45.802/77.096/27.658 ms
$ python ping.py asdasdas.com <-- DNS resolved, but site is down
ping returned 1
PING asdasdas.com (69.172.201.208) 56(84) bytes of data.
--- asdasdas.com ping statistics ---
4 packets transmitted, 0 received, 100% packet loss, time 3024ms
$ python ping.py asdasdasdasda.com <-- DNS failed
ping returned 2
ping: unknown Host asdasdasdasda.com
エラーメッセージにあるように、pingはゼロ以外の終了ステータスで終了しました。それは、例えば指定されたIPアドレスに到達できないか、間違ったパラメーターを渡しました。
ping
manページから( http://linux.die.net/man/8/ping ):
Pingが応答パケットをまったく受信しない場合、コード1で終了します。パケットカウントと期限の両方が指定されており、期限に達するまでに受信されたパケット数がcount未満の場合、コード1で終了します。その他のエラーでは、コード2で終了します。それ以外の場合、コード0で終了します。これにより、終了コードを使用して、ホストが生きているかどうかを確認できます。
CalledProcessError
をキャッチして、output
に何が含まれているかを確認できます。こちらをご覧ください https://docs.python.org/2/library/subprocess.html#subprocess.check_output