由crontab运行时,Python2.7程序无法运行

时间:2018-11-29 17:25:07

标签: python python-2.7 ubuntu cron ubuntu-18.04

硬件设置(计算机等)

  • Ubuntu服务器18.04.1
  • 具有8个端口的串口转USB转换器

Python版本

  • 2.7.15r1

Python程序说明

程序开始创建一些线程时:

  1. 为Modbus服务器创建一个线程。
  2. 为连接的每个串行端口(/dev/ttyUSBn运行1个线程,并开始读取数据。

问题说明

当我使用正常命令python2.7 myProgram.py)运行脚本时,它可以工作,因此modbus服务器启动,我可以读取该值,并且还可以看到在TX-RX LED上的USB串行转换闪烁。 如果我检查读取的数据是否正确,则表明程序运行正常。

当我设置一个运行python脚本的crontab作业时,就会出现问题!

modbus服务器正常启动,但是我看不到USB串行转换器LED闪烁,并且python程序不打印读取的数据。这意味着该程序无法在“串行”端运行。

要创建作业,我使用了以下命令:

  1. crontab -e
  2. 选定的纳米(默认选项)
  3. 在文件末尾添加了cron命令:@reboot /usr/bin/python2.7 /myProgram.py

我不知道问题出在哪里,程序没有捕获异常,并且该过程仍在运行,直到我手动停止它为止。如果我停止了它,然后手动运行它,它将启动并正常工作。

为您提供帮助:

我也尝试过使用**systemctl**运行它,问题是一样的。 引导服务启动时,如果我检查了它,我可以读取:Active(running),但是该软件未从串行端口读取。

问题是:

  • 我该如何解决?
  • crontab作业有问题吗?
  • 也许crontab作业无法访问/ dev /目录?我该如何解决?

对此我感到很困惑,希望问题能够正确创建和格式化。


EDIT 30/11/18:


我删除了crontab命令,并使用this过程创建了运行该程序的服务。

如果我运行命令:service supervision start,我可以看到该进程正在正确运行,而在htop上,我只有4个进程。

htop output

service status output

在这种情况下,程序未从串行端口读取,但是modbus服务器正在运行。您可以看到我只有4个进程,CPU负载太高。

如果我使用以下命令手动运行它:python2.7 LibSupervisione.py

htop命令的输出为: outupt of working program

在这里您可以看到我有更多的进程,每个创建的线程1个,并且cpu上的负载已正确分配。

2 个答案:

答案 0 :(得分:1)

如果您可以使用以下服务运行代码:sudo service <service-name> start,并使用sudo service <serivice-name> status获得良好状态,则可以像这样在crontab -e中对其进行测试(每5分钟运行一次测试):

*/5 * * * * service <service-name> start
*/10 * * * * service <service-name> stop

然后在进行上述测试后使用@rebote


OR:

最后,如果要在系统启动时运行代码/服务,请执行此操作,而不要使用cron jon

使用具有rc.local权限的编辑器编辑sudo文件,然后:

#!/bin/sh -e

# rc.local
#
# This script is executed at the end of each multiuser runlevel.
# Make sure that the script will "exit 0" on success or any other
# value on error.
#
# In order to enable or disable this script just change the execution
# bits.
#
# By default this script does nothing.


service <service-name> start

exit 0

[注意]:

This is the procedure,根据您的代码创建service

答案 1 :(得分:1)

您的脚本可能需要控制台或某些环境变量,但是在systemd启动的过程中,您不会自动拥有这些变量。

最简单的方法是将/usr/bin/bash -c "your command"放在ExecStart字段中的系统单元中,以启用类似于环境的Shell,如下所示:

ExecStart=/bin/bash -c "/usr/bin/python2.7 /myProgram.py" 

WorkingDirectory=yourWorkingDir 

为什么需要使用cron?改用systemd计时器。