背景:我試圖在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的停止工作..不知道它.. –