背景:我正在尝试在PXE获取IP地址时自动重启服务器。这是为了重现一个问题,重现的唯一方法是在每次重启时完全同时冷启动它。我已经厌倦了手动执行此操作,并且在此脚本上花了大约10个小时并且到目前为止进行了故障排除..
我正在尝试从服务器上的串行控制台读取行,同时查找某个字符串,然后发出重新启动命令。
现在,我可以让这个脚本回应串口控制台上的内容的唯一方法是关闭服务器电源,启动minicom,打开服务器电源,文本启动时我可以退出minicom而不重置,然后开始我的剧本。
第一次,脚本运行正常,甚至最后的iLO命令工作,然后它重新启动while循环,但是我不再从控制台获得任何输出。
似乎我要么没有正确打开串口,而是打印get_settings,波特率,停止位等都是正确的。
我搜索并使用了来自许多不同地方的代码片段来破解这个脚本,我真的很沮丧,因为我无法让它自行工作。
[root@localhost ~]# 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和串行控制台相匹配。
那么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()
感谢您的投入和帮助!
答案 0 :(得分:1)
它可能与串口中的其他行保存有关:DTR,DSR等。它们的使用通常不一致,并且它们通常用于其他目的而不是用于它们。
也许minicom使用DTR初始化连接。尝试在序列open
之后添加此内容。
s.setDTR(False)
sleep(0.025)
s.setDTR(True)