Cronjob:Python脚本未写入fi

2024-10-06 12:40:11 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在研究raspbian并编写了一个python脚本,它通过RS232与一些与Raspberry的pysical IO状态相关的硬件进行通信。它还写入日志文件。在

当我从命令行启动脚本时,一切正常: pi@raspberrypi ~/scripts $ python steppercontrol.py

我添加了一个cronjob(sudo crontab -e

SHELL=/bin/bash
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/local/games:/usr/games
@reboot /usr/bin/python /home/pi/scripts/steppercontrol.py

脚本可以工作并在重新启动后运行,但日志文件未写入 syslog给出了以下内容

^{pr2}$

chmods应该正常:

pi@raspberrypi ~/scripts $ ls -lh
total 16K
-rwxr-xr-x 1 pi pi 3.1K May 27 12:55 steppercontrol.py
-rwxrwxrwx 1 pi pi  249 May 29 12:05 stepperlog

在我看来,它与python本身无关。我也无法将stdout从脚本(作为cronjob)重定向到文件。我迷路了,这是我的剧本:

顺便说一句:这是我的第一个python脚本,通常我对linux不是很在行,但是raspbian和google使事情变得简单;-)

import serial
import time
import pifacedigitalio as p
import datetime

# function to read data by busy waiting
# timeout is enable, non blocking
def getData( p ):
   "get data busy waiting"

   d = ''
   if p.inWaiting() <= 0:
     return d

   time.sleep(0.3)
   while p.inWaiting() > 0:
      d += p.read(1)
   return d
# end of function

# main program logig
# init serial communication
port = serial.Serial("/dev/ttyUSB0", bytesize=serial.EIGHTBITS, baudrate=9600, stopbits=serial.STOPBITS_TWO, timeout=1.0)
p.init()
for i in range(0,8):
   p.digital_write(i,0)
   p.digital_write_pullup(i, 1)

logfile = open('/home/pi/scripts/stepperlog','a')
i = datetime.datetime.now()
logfile.write(str(i) + " script started \n")
print(str(i) + " script started \n")

# query hello world string and write answer to screen
port.write("?ver\r")
d = getData(port)
print(">> " + d + "\n")
port.write("!a\r")

# setup stepper drive
port.write("!axis 1 0 0\r")            # disable all axis excep X-axis
port.write("!pitch 1 1 1\r")           # set pitch of rod ... needed?
port.write("!cur 1 1 1\r")             # set current per motor to 1 A
port.write("!accel 0.5 0.5 0.5\r")     # set accelleration to value in m/s^2
port.write("!velfac 0.1 0.1 0.1\r")    # reduce speed by facor 1/10

pinList = [0,0,0,0,0,0]
prevSelection = -2

while 1:
   for i in range(0,6):
      pinList[i] = p.digital_read(i)
      p.digital_write(i,pinList[i])
      #print(">> I/O " + str(i) + " : " + str(pinList[i]))

   speed = 0;
   curSelection = -1

   if pinList[0] == 1:      # position 1
      speed = 5;            # move down fast 5mm/s
      curSelection = 0
   elif pinList[1] == 1:    # position 3
      speed = -0.1;         # move up 50 um/s
      curSelection = 1
   elif pinList[2] == 1:    # position 5
      speed = -0.2;         # move up 100 um/s
      curSelection = 2
   elif pinList[3] == 1:    # position 7
      speed = -0.3;         # move up 100 um/s
      curSelection = 3
   elif pinList[4] == 1:    # position 9
      speed = -0.4;         # move up 100 um/s
      curSelection = 4
   elif pinList[5] == 1:    # position 11
      speed = -5;           # move up fast 5 mm/s
      curSelection = 5

   calcspeed = float(speed)
   calcspeed *= 10/1.36                # factor 10/100 corresponds to speed reduction from above !

   if curSelection != prevSelection:
      i = datetime.datetime.now()
      logfile.write(str(i) + " " + str(prevSelection) + " " + str(curSelection) + " " + str(speed) + " " + str(calcspeed) + "\n")
      print(str(i) + " " + str(prevSelection) + " " + str(curSelection) + " " + str(speed) + " " + str(calcspeed))
   prevSelection = curSelection

   speed = "%.10f" % calcspeed         # float to string
   port.write("!speed" + speed + "\r")

   wait = 0.1
   time.sleep(float(wait))

Tags: to脚本datetimemovebinportusrserial
2条回答

您的cron作业正在向stdout或stderr写入内容-cron收集并尝试将其发送给您,但您的系统没有安装MTA(因此会显示日志消息“no MTA installed”)。尝试将stderr和stdout重定向到一个文件,您可能会得到更多关于问题所在的信息。在

或者,您可以安装MTA并让它向您发送输出—这将帮助您解决将来在处理cron任务时遇到的任何其他问题:

sudo apt-get install postfix

最终答案是显而易见的! 我没有刷新输出。对于stdout,stderr:

import sys
sys.stdout.flush()
sys.stderr.flush()

打开的文件:

^{pr2}$

相关问题 更多 >