【问题标题】:Program execution with crontab使用 crontab 执行程序
【发布时间】:2019-05-01 20:07:31
【问题描述】:

硬件设置(电脑等)

  • Ubuntu 服务器 18.04.1
  • 8 端口串口转 USB 转换器

Python 版本

  • 2.7.15r1

Python程序说明

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

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

问题说明

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

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

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

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

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

我不知道问题出在哪里,程序没有捕获异常并且进程仍在运行,直到我手动停止它。如果我停止它并在之后手动运行它,它就会启动并正常工作。

为您提供帮助:

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

问题是:

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

我对此感到非常困惑,我希望问题的创建和格式正确。


编辑 30/11/18:


我已经删除了 crontab 命令,并创建了一个服务来使用this 过程运行程序。

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

在这种情况下,程序没有从串口读取,但 modbus 服务器正在工作。可以看到我只有4个进程,cpu负载太高了。

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

htop 命令的输出是:

在这里你可以看到我有更多的进程,我创建的每个线程都有 1 个,并且 cpu 上的负载得到了适当的分布。

【问题讨论】:

  • 更改为... myProgram.py >>/tmp/myProgram.log 2>&1,获取错误信息并阅读crontab-not-running-my-python-script
  • 将此#!/usr/bin/env python shebang 添加到您的代码之上,并将chmod 755 设置为您的代码,但最好的方法是从您的代码创建一个服务,我使用来自this procedure那个。
  • @stovfl 我尝试在我的 crontab 命令中添加>>/tmp/myProgram.log 2>&1,但文件中没有打印任何内容。正如我所说的,问题不是 cron 作业没有运行,而是问题在于它运行了,只启动一个程序。无论如何感谢您的帮助!
  • @BenyaminJafari 我已尝试使用 systemctl 创建服务,我将尝试使用您的指南!在文件的顶部,我已经拥有#!/usr/bin/python2.7,并且我已使用以下命令将文件夹的权限更新为 777chmod 777 /programFolder/ -R
  • @CarloZanocco 你能用服务运行你的脚本吗?

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


【解决方案1】:

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

最简单的方法是在 ExecStart 字段中的系统单元中添加 /usr/bin/bash -c "your command" 以启用类似于 Shell 的环境:

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

WorkingDirectory=yourWorkingDir 

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

【讨论】:

  • 我不需要使用cron,我已经测试过了,因为系统,systemctl,服务和cron命令仍然存在问题。我创建了一项服务,但问题仍然存在。程序START但没有从串口读取,但是modbus服务器正在工作。
  • 您是否使用预先添加的 Shell 启动程序?喜欢 bash?我从自己的经验中知道这个问题。
  • 什么意思?对不起,我不知道你前面的 Shell 是什么意思。我使用 ssh root@ip 登录远程计算机,之后我使用 Ubuntu Server 计算机的 shell
  • 你是对的。我明白你的意思!但是在脚本中我必须阅读一个配置文件。我有不绝对的路径!在程序中我有:` path = "Utility/config.txt" , but this is wrong, because the folder is in another folder, so the path is not absolute. The correct way is to use: path = "/Monitoraggio/Utility/config.txt". So I have to start from the /` 目录!
  • 尝试将 systemd 单元更改为:``ExecStart=/bin/bash -c "/usr/bin/python2.7 /myProgram.py" WorkingDirectory=yourWorkingDir ``
【解决方案2】:

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

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

然后在上面的测试之后使用@rebote


或者:

最后,如果您想在系统启动时运行您的代码/服务,请不要使用cron jon

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

#!/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

【讨论】:

  • 问题依然存在。无论如何,该过程运行正常,我的状态一直很好。但问题是程序的工作方式与我手动运行时不同!使用service test start它运行,我状态很好,但是串口无论如何都没有读取。并且服务器 Modbus 工作正常。如果我使用python2.7 myProgram.py 手动运行代码,它可以工作并从串行端口读取。
  • 我在问题中添加了更多信息,请检查编辑
  • 我做到了,请放上你的代码以获得更好的感觉。
  • 我不能放代码,我可以创建一个示例代码与你分享。但是你为什么需要它?代码工作正常,正如我所说,如果我不将其作为服务运行,它就可以工作。
  • 不要用这个,可以直接调用为什么要从系统启动initd。
猜你喜欢
  • 1970-01-01
  • 2011-02-10
  • 1970-01-01
  • 2016-03-02
  • 2016-04-07
  • 1970-01-01
  • 2019-05-09
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多