首页 > 解决方案 > 使用 crontab 执行程序

问题描述

硬件设置(电脑等)

蟒蛇版本

Python程序说明

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

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

问题说明

当我使用普通命令(如果我检查读取的数据它们是正确的,那么程序运行正常。python2.7 myProgram.py

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

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

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

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

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

来帮助你:

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

问题是:

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


编辑 30/11/18:


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

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

htop 输出

服务状态输出

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

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

htop命令的输出是: 工作程序中断

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

标签: pythonpython-2.7ubuntucronubuntu-18.04

解决方案


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

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

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

WorkingDirectory=yourWorkingDir 

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


推荐阅读