【发布时间】:2018-06-28 12:22:04
【问题描述】:
我希望使用 X-CTU 通过 Zigbee/XBee 控制脚本。我创建了一个名为zb_control.py 的脚本。现在我试图在这个脚本中启动和停止另一个脚本。脚本adxl345test.py 用于从我的 Raspberry Pi 上连接的加速度计收集数据。
zb_control.py 脚本背后的想法是我运行它,然后如果我在 X-CTU 中键入“run”,脚本将开始运行 adxl345test.py 并收集数据。
我正在尝试在脚本中创建一个脚本,该脚本也可以再次停止,然后仍然让 zb_control.py 运行以准备接收来自 X-CTU 的新输入。
如你所知,我尝试了不同的方法:
import serial, time, sys, os, subprocess
from subprocess import check_call
from subprocess import call
while True:
ser=serial.Serial('/dev/ttyUSB0',9600,timeout=2)
inc=ser.readline().strip()
if inc=='run':
print("---------------")
print("Collecting data")
print("---------------")
p = subprocess.Popen("/home/pi/adxl345test.py", stdout=subprocess.PIPE, shell=True)
elif inc=='stop':
# check_call(["pkill", "-9", "-f", adxl345test.py])
# serial.write('\x03')
# os.system("pkill –f adxl345test.py")
# call(["killall", "adxl345test.py"])
p.kill()
print("-----------------------")
print("Script has been stopped")
print("-----------------------")
我让它运行,它现在正在正确收集数据。但是现在问题是再次停止 adxl345test.py。从上面的脚本可以看出,我正在使用 p.kill() 但脚本不会停止收集数据。当我在 XCTU 中键入“停止”时,我的 zb_control.py 确实打印了打印命令,但 p.kill() 没有被执行。有什么建议吗?
我试过单独使用p.terminate() 和p.kill() 以及它们自己的命令,但它不会停止adxl345test.py 脚本。我可以看出 .csv 文件的大小仍在增加,因此脚本必须仍在收集数据。
【问题讨论】:
-
这可能无法解决您的问题,但首先执行
p.terminate()以便将 SIGTERM 信号发送到进程并允许它通过适当的清理等正常终止可能是有意义的。请注意,收到 SIGTERM 后,进程将需要一些时间才能停止。 -
+1 使用 SIGTERM。以下是如何在 python 中优雅地处理它:stackoverflow.com/questions/18499497/…
-
adxl345test.py是您编写的脚本还是您在某处找到的东西?如果它是您自己的代码,您可能需要考虑更改它,以便它可以正确停止。通过捕获信号(杀死或终止),或检查某种事件,甚至像检查某个目录中是否存在oh_god_please_stop.txt文件这样粗略的事情。