程序开始创建一些线程时:
/dev/ttyUSBn
运行1个线程,并开始读取数据。当我使用正常命令(python2.7 myProgram.py
)运行脚本时,它可以工作,因此modbus服务器启动,我可以读取该值,并且还可以看到在TX-RX LED上的USB串行转换闪烁。
如果我检查读取的数据是否正确,则表明程序运行正常。
当我设置一个运行python脚本的crontab作业时,就会出现问题!
modbus服务器正常启动,但是我看不到USB串行转换器LED闪烁,并且python程序不打印读取的数据。这意味着该程序无法在“串行”端运行。
要创建作业,我使用了以下命令:
crontab -e
@reboot /usr/bin/python2.7 /myProgram.py
我不知道问题出在哪里,程序没有捕获异常,并且该过程仍在运行,直到我手动停止它为止。如果我停止了它,然后手动运行它,它将启动并正常工作。
我也尝试过使用**systemctl**
运行它,问题是一样的。
引导服务启动时,如果我检查了它,我可以读取:Active(running)
,但是该软件未从串行端口读取。
问题是:
对此我感到很困惑,希望问题能够正确创建和格式化。
我删除了crontab命令,并使用this过程创建了运行该程序的服务。
如果我运行命令:service supervision start
,我可以看到该进程正在正确运行,而在htop
上,我只有4个进程。
在这种情况下,程序未从串行端口读取,但是modbus服务器正在运行。您可以看到我只有4个进程,CPU负载太高。
如果我使用以下命令手动运行它:python2.7 LibSupervisione.py
在这里您可以看到我有更多的进程,每个创建的线程1个,并且cpu上的负载已正确分配。
答案 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计时器。