使用 crontab 执行程序
Program execution with crontab
硬件设置(电脑等)
- Ubuntu 服务器 18.04.1
- 带 8 个端口的串口转 USB 转换器
Python版本
- 2.7.15r1
Python 节目描述
当程序开始创建一些线程时:
- 为 Modbus 服务器创建一个线程。
- 运行每个串口连接1个线程(
/dev/ttyUSBn
)并开始读取数据。
问题解释
当我 运行 使用 普通命令 (python2.7 myProgram.py
) 的脚本工作时,modbus 服务器启动,我可以读取值,我还可以看到 usb-serial convert 在 TX-RX LED 上闪烁。
如果我检查读取的数据,它们是正确的,那么程序运行正常。
当我设置一个 运行 我的 python 脚本的 crontab 作业时,问题就出现了!
modbus 服务器正常启动,但我看不到 usb-serial 转换器 LED 闪烁,python 程序不打印读取的数据。这意味着该程序无法在 "serial" 端运行。
为了创建作业,我使用了以下命令:
crontab -e
- 已选择纳米(默认选项)
- 在文件末尾添加了 cron 命令:
@reboot /usr/bin/python2.7 /myProgram.py
我无法弄清楚问题出在哪里,程序没有捕捉到异常并且进程仍在 运行ning 直到我手动停止它。如果我停止它并 运行 之后手动启动它并正常工作。
帮你:
我也试过运行用**systemctl**
,问题是一样的。
启动时服务启动,如果我检查它,我可以读取:Active(running)
,但软件没有从串行端口读取。
问题是:
- 如何解决?
- crontab 作业有问题吗?
- 也许crontab作业无法访问/dev/目录?我该如何解决?
我对此很困惑,我希望问题的创建和格式正确。
编辑 2018 年 11 月 30 日:
我删除了 crontab 命令,并使用 this 过程为 运行 程序创建了一个服务。
如果我 运行 命令:service supervision start
我可以看到进程 运行 正确并且 htop
我只有 4 个进程。
在这种情况下,程序没有从串口读取,但modbus服务器正在工作。你可以看到我只有 4 个进程,cpu 负载太高了。
如果我运行手动使用命令:python2.7 LibSupervisione.py
htop
命令的输出是:
在这里你可以看到我有更多的进程,我创建的每个线程 1 个,cpu 上的负载被正确分配。
如果您可以 运行 您的代码使用这样的服务:sudo service <service-name> start
并使用 sudo service <serivice-name> status
获得良好状态,您可以像这样在 crontab -e
中测试它(运行 每 5 分钟进行一次测试):
*/5 * * * * service <service-name> start
*/10 * * * * service <service-name> stop
然后在上面的测试之后使用@rebote
。
或:
最后,如果您想在系统启动时 运行 您的 code/service,请执行此操作而不是 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
。
您的脚本可能需要控制台或一些环境变量,但在 systemd 启动的进程中您不会自动拥有这些。
最简单的方法是在 ExecStart
字段中的系统单元中添加 /usr/bin/bash -c "your command"
以启用 Shell 像这样的环境:
ExecStart=/bin/bash -c "/usr/bin/python2.7 /myProgram.py"
WorkingDirectory=yourWorkingDir
为什么需要使用cron?请改用 systemd 计时器。
硬件设置(电脑等)
- Ubuntu 服务器 18.04.1
- 带 8 个端口的串口转 USB 转换器
Python版本
- 2.7.15r1
Python 节目描述
当程序开始创建一些线程时:
- 为 Modbus 服务器创建一个线程。
- 运行每个串口连接1个线程(
/dev/ttyUSBn
)并开始读取数据。
问题解释
当我 运行 使用 普通命令 (python2.7 myProgram.py
) 的脚本工作时,modbus 服务器启动,我可以读取值,我还可以看到 usb-serial convert 在 TX-RX LED 上闪烁。
如果我检查读取的数据,它们是正确的,那么程序运行正常。
当我设置一个 运行 我的 python 脚本的 crontab 作业时,问题就出现了!
modbus 服务器正常启动,但我看不到 usb-serial 转换器 LED 闪烁,python 程序不打印读取的数据。这意味着该程序无法在 "serial" 端运行。
为了创建作业,我使用了以下命令:
crontab -e
- 已选择纳米(默认选项)
- 在文件末尾添加了 cron 命令:
@reboot /usr/bin/python2.7 /myProgram.py
我无法弄清楚问题出在哪里,程序没有捕捉到异常并且进程仍在 运行ning 直到我手动停止它。如果我停止它并 运行 之后手动启动它并正常工作。
帮你:
我也试过运行用**systemctl**
,问题是一样的。
启动时服务启动,如果我检查它,我可以读取:Active(running)
,但软件没有从串行端口读取。
问题是:
- 如何解决?
- crontab 作业有问题吗?
- 也许crontab作业无法访问/dev/目录?我该如何解决?
我对此很困惑,我希望问题的创建和格式正确。
编辑 2018 年 11 月 30 日:
我删除了 crontab 命令,并使用 this 过程为 运行 程序创建了一个服务。
如果我 运行 命令:service supervision start
我可以看到进程 运行 正确并且 htop
我只有 4 个进程。
在这种情况下,程序没有从串口读取,但modbus服务器正在工作。你可以看到我只有 4 个进程,cpu 负载太高了。
如果我运行手动使用命令:python2.7 LibSupervisione.py
htop
命令的输出是:
在这里你可以看到我有更多的进程,我创建的每个线程 1 个,cpu 上的负载被正确分配。
如果您可以 运行 您的代码使用这样的服务:sudo service <service-name> start
并使用 sudo service <serivice-name> status
获得良好状态,您可以像这样在 crontab -e
中测试它(运行 每 5 分钟进行一次测试):
*/5 * * * * service <service-name> start
*/10 * * * * service <service-name> stop
然后在上面的测试之后使用@rebote
。
或:
最后,如果您想在系统启动时 运行 您的 code/service,请执行此操作而不是 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
。
您的脚本可能需要控制台或一些环境变量,但在 systemd 启动的进程中您不会自动拥有这些。
最简单的方法是在 ExecStart
字段中的系统单元中添加 /usr/bin/bash -c "your command"
以启用 Shell 像这样的环境:
ExecStart=/bin/bash -c "/usr/bin/python2.7 /myProgram.py"
WorkingDirectory=yourWorkingDir
为什么需要使用cron?请改用 systemd 计时器。