背景:我试图在PXE获取IP地址时自动重启服务器。这是为了重现问题,重现的唯一方法是在每次重启的同时冷启动它。我厌倦了这样做手动,并花了大概10个小时在这个脚本和故障排除到目前为止..无法打开串口或从串口读取pyserial
我试图从串行控制台读取服务器上的行,而寻找一个特定的字符串,然后发出重新启动命令。
现在,我可以让这个脚本回应串口控制台上出现的内容的唯一方法是关闭服务器,启动minicom,打开服务器电源,当文本启动时,我可以退出minicom而无需重置,然后启动我的脚本。
第一次通过,该脚本能正常工作,甚至将iLO在结束工作命令,然后将重新启动while循环,但我没有得到从控制台的任何输出了。
看来,我要么不正确打开串口,但我打印get_settings和波特率,停止位等,都是正确的。
我已搜查和使用的代码片段来自许多不同的地方砍起来这个剧本,而且我真的感到沮丧,我不能让这个对自己的工作。
[[email protected] ~]# python2 bootorder.py
{'parity': 'N', 'baudrate': 115200, 'bytesize': 8, 'xonxoff': False, 'rtscts': False, 'timeout': None, 'inter_byte_timeout': None, 'stopbits': 1, 'dsrdtr': False, 'write_timeout': None}
正如你可以在上面看到,当我有它运行,我打印出来的串口设置,并且它们匹配小型机和服务器端的串行控制台。
那么minicom如何开启我在脚本中没有做的端口?我遵循许多网站的例子,有时它确实有用,但我无法弄清楚如何独立完成这项工作。
这里是我的脚本:
#!/usr/bin/python
import io
import hpilo
import os
import sys
import time
import serial
from datetime import datetime
outfile='/tmp/bootordercount.txt'
# configure the serial connections (the parameters differs on the device you are connecting to)
port = '/dev/ttyS0'
ser = serial.Serial(port,115200,timeout=None)
cycles = 1
if ser.isOpen(): ser.close()
ser.open()
if ser.isOpen():
try:
# ser.flushInput() #flush input buffer, discarding all its contents
# ser.flushOutput()#flush output buffer, aborting current output
#and discard all that is in buffer
print(ser.get_settings())
with open(outfile, 'a') as f:
while ser.isOpen():
line = ser.readline()
print line
if "CLIENT IP:" in line:
print "Client string seen!"
ilo = hpilo.Ilo('10.0.8.203', 'administrator', 'password') #configure ilo function
ilo.cold_boot_server() #cold boot the server
print cycles
# f.write(datetime.utcnow().isoformat() + '\t' + cycles + '\n')
# f.flush()
cycles += 1
except Exception, e1:
print "error communicating...: " + str(e1)
ser.close()
谢谢你的投入和帮助!
也是我认为的readline部分是正确的,因为它的工作原理正确一次性通过,但周期后,我从串口退出获取数据,或readline的停止工作..不知道它.. –