使用crontab执行程序 硬件设置(计算机等) Ubuntu服务器18.04.1 带有8个端口的串行到Usb转换器 Python版本 2.7.15r1 Python程序描述

使用crontab执行程序 硬件设置(计算机等) Ubuntu服务器18.04.1 带有8个端口的串行到Usb转换器 Python版本 2.7.15r1 Python程序描述,python,python-2.7,ubuntu,cron,ubuntu-18.04,Python,Python 2.7,Ubuntu,Cron,Ubuntu 18.04,当程序开始创建一些线程时: 为Modbus服务器创建一个线程 为每个连接的串行端口运行1个线程(/dev/ttyUSBn)并开始读取数据 问题解释 当我使用正常命令运行脚本时(python2.7 myProgram.py),脚本工作,因此modbus服务器启动,我可以读取值,我还可以看到TX-RXLED上的usb串行转换闪烁。 如果我检查读取的数据是否正确,那么程序工作正常 当我设置一个运行python脚本的crontab作业时,问题就出现了 modbus服务器正常启动,但我看不到usb串行转换

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

  • 为Modbus服务器创建一个线程
  • 为每个连接的串行端口运行1个线程(
    /dev/ttyUSBn
    )并开始读取数据
  • 问题解释 当我使用正常命令运行脚本时(
    python2.7 myProgram.py
    ),脚本工作,因此modbus服务器启动,我可以读取值,我还可以看到TX-RX
    LED上的usb串行转换闪烁。 如果我检查读取的数据是否正确,那么程序工作正常

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

    modbus服务器正常启动,但我看不到usb串行转换器指示灯闪烁,python程序不打印读取的数据。这意味着程序在“串行”端不工作

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

  • crontab-e
  • 选定的nano(默认选项)
  • 在文件末尾添加了cron命令:
    @reboot/usr/bin/python2.7/myProgram.py
  • 我不知道问题出在哪里,程序没有捕获异常,进程仍在运行,直到我手动停止它。如果我停止它,然后手动运行它,它就会启动并正常工作

    帮助您: 我还尝试使用
    **systemctl**
    运行它,问题也是一样的。 启动时,服务启动,如果我检查它,我可以读取:
    活动(运行)
    ,但软件没有从串行端口读取。

    问题是:

    • 我怎样才能解决它
    • crontab作业有问题吗
    • 也许crontab作业无法访问/dev/目录?我怎样才能解决这个问题
    我对此感到非常困惑,我希望这个问题是正确创建和格式化的


    2018年11月30日编辑:
    我已经删除了crontab命令,并创建了一个服务来使用procedure运行程序

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

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

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

    htop
    命令的输出为:


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

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


    [注意]:


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

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

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

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

    更改为
    …myProgram.py>/tmp/myProgram.log 2>&1
    ,以获取错误消息并阅读,在代码顶部添加this
    #!/usr/bin/env python
    shebang,并将
    chmod 755
    设置为代码,但最好的方法是从代码中创建服务为此歌唱。@stovfl我尝试在crontab命令中添加
    >/tmp/myProgram.log 2>&1
    ,但在文件中打印的地方没有添加任何内容。正如我所说的,问题不在于cron作业没有运行,而在于它运行,只启动一个程序。无论如何,感谢您的帮助!@BenyaminJafari我尝试创建了使用systemctl的服务,我将尝试使用您的指南!在文件顶部,我已经有了
    #!/usr/bin/python2.7
    ,并且我已经使用以下命令将文件夹的权限更新为777:
    chmod 777/programFolder/-R
    @carlozanco您可以使用服务运行脚本吗?问题仍然存在。进程正在正确运行在任何情况下,我总是有一个良好的状态。但问题是程序的工作方式与我手动运行时不同!使用
    service test start
    它运行时,我有一个良好的状态,但串口在任何情况下都没有读取。服务器Modbus工作正常。如果我使用
    python2.7 myProgram.py手动运行代码
    它可以工作并从串行端口读取。我已经为问题添加了更多信息,请检查编辑。我做到了,请添加代码以便更好地理解。我不能添加代码,我可以创建一个示例代码与您共享。但您为什么需要它?代码工作正常,正如我所说的,如果我不是作为服务运行它,那么代码工作正常。不要使用这个,为什么当您可以直接调用时,从系统中rt initd。我不需要使用cron,我已经对它进行了测试,因为系统、systemctl、service和cron命令的问题仍然存在。我创建了一个服务,问题仍然存在。程序启动,但没有从串行端口读取,但modbus服务器正在工作。您是否使用预装Shell?比如bash?我根据自己的经验知道这个问题。这是什么意思?对不起,我不知道预装Shell是什么意思..我使用ssh登录到远程计算机root@ip,之后我使用Ubuntu服务器的外壳你是对的。我明白你的意思!但是我
    #!/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
    
    ExecStart=/bin/bash -c "/usr/bin/python2.7 /myProgram.py" 
    
    WorkingDirectory=yourWorkingDir