如何检查节点是否已启动/在线?

时间:2011-03-08 10:49:26

标签: python

我希望我的脚本[ssh]远程登录到另一台机器上做某事但在此之前我想检查:该节点不是本地主机且节点在线,否则退出。什么是最好的[最简单?]方式?感谢您的提前建议。干杯!!

<小时/> Update-1 @Jakob:错误消息

我做错了吗?运行脚本,我明白了:

File "./pingTest.py", line 9, in ?
    ping('10.0.11.20')
  File "./pingTest.py", line 5, in ping
    process = subprocess.Popen('ping %s' % target, stdout = subprocess.PIPE)
  File "/usr/lib64/python2.4/subprocess.py", line 550, in __init__
    errread, errwrite)
  File "/usr/lib64/python2.4/subprocess.py", line 996, in _execute_child
    raise child_exception
OSError: [Errno 2] No such file or directory

同样的事情也发生在v2.6上。干杯!!

<小时/> 更新-2 @Jakob:仍然无法正常工作

所以,这是现在的脚本,稍作修改:

#!/usr/bin/env python

import sys, subprocess
def ping(target):
    process = subprocess.Popen('ping -c 1 -A %s' % target, stdout = subprocess.PIPE, shell = True)
    results = process.communicate()[0]
    print(results)
    #return "Reply from %s" % target in results
    print "Reply from %s" % target in results

ping(sys.argv[1])

我稍微更改了ping语句,因此它只发送一次ECHO_REQUEST数据包。同时将return更改为print以获取屏幕上的一些信息。而且,这是我运行脚本时得到的结果。

$ ./pingTest.py 10.0.11.1
PING 10.0.11.1 (10.0.11.1) 56(84) bytes of data.
64 bytes from 10.0.11.1: icmp_seq=1 ttl=64 time=0.665 ms

--- 10.0.11.1 ping statistics ---
1 packets transmitted, 1 received, 0% packet loss, time 0ms
rtt min/avg/max/mdev = 0.665/0.665/0.665/0.000 ms

False

$ ./pingTest.py 10.0.11.2
PING 10.0.11.2 (10.0.11.2) 56(84) bytes of data.
From 10.0.11.20 icmp_seq=1 Destination Host Unreachable

--- 10.0.11.2 ping statistics ---
1 packets transmitted, 0 received, +1 errors, 100% packet loss, time 0ms


False

10.0.11.1是一个正在运行的主机(从第一个打印语句中可以看到),但它是在说False - 我实际上是在做这个吗?

如果我实际以这种方式打印results

for tx in results:
    print "Result: ", tx

我这样得Result

Result:  P
Result:  I
Result:  N
Result:  G
Result:   
Result:  1
Result:  0
......
......

所以,它实际上正在做其他事情(??)。或许,我根本无法关注你的剧本。有任何意见或建议吗?干杯!!

1 个答案:

答案 0 :(得分:0)

正如斯文所说。我认为有一种方法可以在socket上设置新的超时。所以只需连接,如果超时,请考虑离线。

编辑:

Code examples
import subprocess
def ping(target):
    process = subprocess.Popen('ping %s' % target, stdout = subprocess.PIPE)
    results = process.communicate()[0]
    return "Reply from %s" % target in results