Python 'subprocess' CalledProcessError: Command '[...]' returned non-zero exit status 1

74,858

Solution 1

subprocess.check_output raises CalledProcessError on non-zero exit code, and ping returns non-zero exit code if something is wrong (e.g. unknown domain name, or site is down, or site has ICMP blocked for some reason, or your Internet connection is down).

If you want to examine both output and exit code, use 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())

Examples:

$ 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

Solution 2

As your error message said, ping finished with non zero exit status. It might mean that e.g. the IP address provided is not reachable or you passed in wrong parameters.

From ping man page (http://linux.die.net/man/8/ping):

If ping does not receive any reply packets at all it will exit with code 1. If a packet count and deadline are both specified, and fewer than count packets are received by the time the deadline has arrived, it will also exit with code 1. On other error it exits with code 2. Otherwise it exits with code 0. This makes it possible to use the exit code to see if a host is alive or not.

You can try to catch CalledProcessError and see what it contains in output. Have a look here https://docs.python.org/2/library/subprocess.html#subprocess.check_output

Share:
74,858
Basssprosse
Author by

Basssprosse

(Your about me is currently blank. )

Updated on February 01, 2020

Comments

  • Basssprosse
    Basssprosse over 4 years

    Executing the following script...

    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
    
    [...]
    

    ... results in an error:

    CalledProcessError: Command '[ping', '-q', '-c2', '-W1', '10.81.3.80 ']' returned non-zero exit status 1

    Adding "stderr = STDOUT" in check_output did not produce any useful feedback.

    How can I obtain more information regarding the error so that I can troubleshoot it?