我正在为来访的高中生做一个辅导。
使用Node RED,我有一个运行用python编写的脚本的Raspberry Pi。我希望通过传递keyboardInterrupt(CTRL+C)从node RED结束python脚本,以便脚本优雅地结束,并为下一次运行清理GPIO。
通过使用node RED中的EXEC块并将“sudo python Documents/python/blinker.py”传递给终端,我可以很好地运行脚本。问题是因为我不是直接在终端工作,我不能只使用CTRL+C退出while循环。有没有办法将CTRL+C从node RED传递到终端?
我已经为那些感兴趣的人附上了python代码:
import RPi.GPIO as GPIO
import time
pwmPin = 18
ledPin = 23
butPin = 17
dc = 95
GPIO.setmode(GPIO.BCM)
GPIO.setup(ledPin, GPIO.OUT)
GPIO.setup(pwmPin, GPIO.OUT)
pwm = GPIO.PWM(pwmPin, 50)
GPIO.setup(butPin, GPIO.IN, pull_up_down=GPIO.PUD_UP)
GPIO.output(ledPin, GPIO.LOW)
pwm.start(dc)
print("Press CTRL+C to exit")
try:
while 1:
if GPIO.input(butPin):
pwm.ChangeDutyCycle(dc)
GPIO.output(ledPin, GPIO.LOW)
else:
pwm.ChangeDutyCycle(100-dc)
GPIO.output(ledPin, GPIO.HIGH)
time.sleep(0.075)
GPIO.output(ledPin, GPIO.LOW)
time.sleep(0.075)
except keyboardInterrupt:
pwm.stop()
GPIO.cleanup()
我试过使用kill和killall命令,这会终止应用程序,但是GPIO.cleanup()当时没有运行,并且任何打开的输出都将保持打开。
我也试过传递“echo$'\cc'|./blinker.py”,但得到了一个预导弹错误。
/bin/sh: 1: Documents/python/blinker.py: Permission denied echo: write error: Broken pipe
任何帮助都是感激的
最佳答案
对于长时间运行的脚本,您可能应该使用daemon节点而不是exec节点。
但是,在部署新版本的流时,这两个节点都将尝试终止脚本的任何运行实例(导致节点被重建)。
您还可以显式地通过发送带有要发送的信号名称的msg.kill
来杀死守护进程节点。从守护程序节点文档:
将msg.kill设置为信号名(例如SIGINT、SIGHUP)将停止
进程-但如果设置了重新启动标志,则它将自动重新启动。
使用sudo运行脚本的事实是,您不能直接终止脚本,因为您试图终止一个由root拥有的进程。如果将信号发送到正在运行的sudo实例,则进程应终止子进程。
关于linux - 如何从Node-RED传递CTRL + C到Raspberry Pi终端?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/50377356/