python - 使用 crontab 执行程序
问题描述
硬件设置(电脑等)
- Ubuntu 服务器 18.04.1
- 带 8 个端口的串口转 USB 转换器
蟒蛇版本
- 2.7.15r1
Python程序说明
当程序开始创建一些线程时:
- 为 Modbus 服务器创建一个线程。
- 为每个连接的串行端口运行 1 个线程 (
/dev/ttyUSBn
) 并开始读取数据。
问题说明
当我使用普通命令(如果我检查读取的数据它们是正确的,那么程序运行正常。python2.7 myProgram.py
当我设置一个运行我的 python 脚本的 crontab 作业时,问题就出现了!
modbus 服务器正常启动,但是我看不到usb-serial 转换器的LED 闪烁并且python 程序不打印读取的数据。这意味着该程序无法在“串行”端运行。
为了创建作业,我使用了以下命令:
crontab -e
- 选择纳米(默认选项)
- 在文件末尾添加 cron 命令:
@reboot /usr/bin/python2.7 /myProgram.py
我不知道问题出在哪里,程序没有捕获异常并且进程仍在运行,直到我手动停止它。如果我停止它并在之后手动运行它,它就会启动并正常工作。
来帮助你:
我也试过用 运行它**systemctl**
,问题是一样的。在启动服务启动时,如果我检查它,我可以读取:Active(running)
,但软件没有从串行端口读取。
问题是:
- 我该如何解决?
- crontab 作业有问题吗?
- 也许 crontab 作业无法访问 /dev/ 目录?我该如何解决这个问题?
我对此感到非常困惑,我希望问题的创建和格式正确。
编辑 30/11/18:
我已经删除了 crontab 命令,并创建了一个服务来使用这个过程运行程序。
如果我运行命令:service supervision start
我可以看到该进程正在正确运行,并且htop
我只有 4 个进程。
在这种情况下,程序没有从串口读取,但 modbus 服务器正在工作。可以看到我只有4个进程,cpu负载太高。
如果我使用以下命令手动运行它:python2.7 LibSupervisione.py
在这里你可以看到我有更多的进程,我创建的每个线程都有 1 个,并且 cpu 上的负载得到了适当的分布。
解决方案
您的脚本可能需要控制台或一些环境变量,但在 systemd 启动的进程中,您不会自动拥有这些。
最简单的方法是/usr/bin/bash -c "your command"
在您的系统单元中预先添加字段ExecStart
,以启用类似于环境的 Shell:
ExecStart=/bin/bash -c "/usr/bin/python2.7 /myProgram.py"
WorkingDirectory=yourWorkingDir
为什么需要使用 cron?请改用 systemd 计时器。
推荐阅读
- ruby-on-rails - 更新 Spree 用户自定义属性时出错
- python - 如何使用熊猫将这个多页抓取保存到只有一个标题且没有索引的 csv 中
- html - 一次居中垂直图像和 UL (HTML CSS)
- php - AWS 错误 404 Not Found nginx/1.18.0 in elastic beanstalk with laravel
- javascript - 如何使用 JavaScript 从同一个文件中导出和导入多个对象?
- javascript - javascript 静态类方法 VS 实例类方法
- mysql - 为什么 phpmyadmin cpanel 中的所有表都缺少创建编辑删除和唯一 ID?
- android - onQueryTextSubmit 从未调用过
- jquery - 如何使用 jQuery 正确更改单选按钮标签?
- yaml - Prometheus file_sd_config yml 解组错误