其中一个 Python 脚本在启动时未运行,因为它需要从服务器获取输入

其中一个 Python 脚本在启动时未运行,因为它需要从服务器获取输入

我有四个在启动时运行的 python 脚本。我编写了一个 shell 脚本,其中包含所有四个 python 脚本

我的shell脚本如下:sudo nano启动器.sh

#!/bin/sh    
cd / 
cd /home/pi/myfile  
python3 script1.py &    
python3 script2.py &    
python3 script3.py &    
python3 script4.py &    
cd /

我已经使用 crontab 安排了 shell 脚本在启动时运行该脚本。

sudo crontab -e

@reboot  sh /home/pi/myfile/launcher.sh &

sudo reboot

除了脚本 3脚本3接受来自服务器的输入并相应地执行脚本。(基本上通过接收来自服务器的输入来打开和关闭灯)

我想并行运行所有四个脚本。由于脚本 3 从服务器获取输入,因此它不在后台运行。请为我提供解决方案,以便所有脚本在启动时运行。

注意:当我使用 shell 脚本手动运行启动器时,所有四个脚本都会运行。 我使用命令运行它sh 启动器.sh

脚本3.py

#!/usr/bin/env python3
import RPi.GPIO as GPIO
from requests import ReadTimeout, ConnectTimeout, HTTPError, Timeout, ConnectionError
import os,time,datetime,urllib3,json
import urllib.request
import requests
from time import sleep
import ast
import json

GPIO.setmode(GPIO.BOARD)
GPIO.setwarnings(False)

from config import *  #pin configuration file

global date_time,API_KEY,API,poleID,streetlightID

now=datetime.datetime.now()

API_ENDPOINT = API + "light/log"
GPIO.setup(light, GPIO.OUT)  

current_light_on_off_state = ""

def getInfo():
    r = requests.get(url = API +"light/state/" + poleID + "/" + API_KEY)
    data = r.json()
    return data

def postLightLog(data):
    r = requests.post(url = API_ENDPOINT, data=data)
    data = r.json()

def on_or_off_light(input_data, state):
    global current_light_on_off_state
    if(state != current_light_on_off_state):
        current_light_on_off_state = state
        print("light state= ",state)
        if(state == True):
            GPIO.output(light, GPIO.HIGH) # on
        else:
            GPIO.output(light, GPIO.LOW)  #off      
        postLightLog(input_data)

try:
    while True:
        data = getInfo()
        if(data['status'] == 'success'):
            res = data['result']
            input_data = {
                "logTime":str(now) ,
                "remarks": "on or off status",
                "state": res["state"],
                "authKey": API_KEY
                }
            on_or_off_light(input_data, res["state"])
        else:
            print('No data from server')
        time.sleep(2)
except KeyboardInterrupt:
    pass

答案1

然而,我不太清楚您的问题是什么以及您想要实现什么:

  • cron 用于计划任务,如果您想在启动时启动某些程序,您应该设置一个服务。这里有一个关于如何操作的示例: https://www.suse.com/support/kb/doc/?id=000019672
  • 对于 Raspberry 上的 Python GPIO LED,您需要超级用户权限。确保设置了适当的用户/权限

干杯

相关内容