저는 Python 코드 작성에 꽤 능숙하지만 BASH는 저에게 꽤 새로운 기능이므로 라이브 스트리밍 JSON 파일에서 센서 데이터를 읽고 실시간으로 데이터를 처리하려는 목표를 달성하려면 높은 수준의 접근 방식을 선택하는 데 몇 가지 지침이 필요합니다. 시간 파이썬.
설정: Ubuntu 18.04를 실행하는 시스템이 있습니다. 시스템은 일부 센서를 읽고 판독값을 JSON 파일로 전송하는 주변 장치에 연결됩니다. 흐름을 시작하기 위해 디렉터리를 생성하고 서비스를 시작하는 간단한 bash 스크립트를 작성했습니다.
sudo service my_service stop
if [ -d $LOGDIR ]; then
echo "All data in ws_log will be erased. Continue? [Y/n]: "
read ans
if [ "${ans,,}" = "y" ]; then
sudo rm -Rf $LOGDIR/*
echo Directory cleared.
else
echo Exiting Script
exit 1
fi
else
mkdir $LOGDIR
echo $LOGDIR Successfully created!
fi
sudo $SERVDIR/my_service --recording-directory $LOGDIR
서비스가 실행되면 로깅이 완료되면 사용자에게 Ctrl+c를 누르라는 메시지를 터미널에 인쇄합니다(따라서 서비스는 SIGINT를 수신할 때까지 터미널을 차단합니다).
screen 명령을 사용하고 Python 하위 프로세스 모듈을 통해 명령을 전달하여 별도의 화면에서 실행하려고 합니다. 그러나 이것은 복잡해 보이고 화면 명령이 작업에 가장 적합한 도구인지 확신할 수 없습니다. 아이디어?
다음 질문: JSON 파일의 각 객체는 6개의 샘플과 타임스탬프를 포함하는 패킷입니다. 스트리밍 JSON 파일은 초당 20번 추가됩니다. JSON 파일은 "["로 시작하고 쉼표로 구분된 JSON 개체를 포함합니다. 문제는 스트리밍이기 때문에 후행 "]"가 없고 쉼표로 끝난다는 것입니다.
지금까지 sed를 사용하여 JSON 파일의 마지막 쉼표를 "]"로 바꾸는 이 명령을 생각해냈습니다.잭JSON 개체를 한 줄에 하나의 개체로 인식하고 형식을 지정하는 기능입니다.
sed "$ s/,/]/g" log.json | jq -c '.[]' | tail -F >> simpler_log.txt
그러나 Python 또는 bash 스크립트에서 중지하라고 지시할 때까지 이 행이 계속 실행되기를 원합니다. 이상적으로는 tail -f의 추적을 사용하여 동일한 줄이 두 번 읽히는 것을 방지할 수 있습니다. 이 문제를 어떻게 해결해야 합니까? 아니면 이 부분을 다르게 해야 하나요?
마지막 질문: 이 데이터를 Python 스크립트에 푸시/풀링하는 방법을 제안하는 방법은 무엇입니까?
나는 구문 분석된 줄 수를 계산하고 다음과 같이 후속 읽기를 수행할 수 있다고 생각했습니다.
pseudo: json.loads(log_file[last_rec_line+1:-1])
하지만 데이터를 Python으로 효율적으로 가져오는 방법에 대한 제안 사항을 듣고 싶습니다.
여기에 많은 내용이 있다는 것을 알고 있으며 도움을 주실 수 있으면 정말 감사하겠습니다!
편집: 다음은 다음과 같이 스트리밍된 log.json 입력의 예입니다.
[{
"s_data": {
"data": [
[
8555103,
8461910,
16777215,
0
],
[
8555205,
8462544,
16777215,
0
],
[
8555096,
8461902,
16777215,
0
],
[
8555263,
8462570,
16777215,
0
],
[
8555098,
8461900,
16777215,
0
],
[
8555281,
8462483,
16777215,
0
]
],
"interval_usec": 8333
},
"ts": 1570255057513
},
{
"s_data": {
"data": [
[
8555122,
8461908,
16777215,
0
],
[
8555274,
8462550,
16777215,
0
],
[
8555089,
8461951,
16777215,
0
],
[
8555255,
8462559,
16777215,
0
],
[
8555081,
8461911,
16777215,
0
],
[
8555194,
8462522,
16777215,
0
]
],
"interval_usec": 8333
},
"ts": 1570255057563
},
이것은 simple_log.txt의 출력입니다.
{"s_data":{"data":[[8556322,8463977,16777215,0],[8555709,8463977,16777215,0],[8556350,8463989,16777215,0],[8555698,8463993,16777215,0],[8556240,8463965,16777215,0],[8555644,8463958,16777215,0]],"interval_usec":8333},"ts":1570492754634}
{"s_data":{"data":[[8556304,8463955,16777215,0],[8555698,8463973,16777215,0],[8556315,8463965,16777215,0],[8555700,8463962,16777215,0],[8556281,8464029,16777215,0],[8555706,8464020,16777215,0]],"interval_usec":8333},"ts":1570492754684}
{"s_data":{"data":[[8556269,8463948,16777215,0],[8555716,8464027,16777215,0],[8556308,8463958,16777215,0],[8555658,8464075,16777215,0],[8556263,8463945,16777215,0],[8555722,8463991,16777215,0]],"interval_usec":8333},"ts":1570492754734}
{"s_data":{"data":[[8556384,8463866,16777215,0],[8555703,8464072,16777215,0],[8556343,8464003,16777215,0],[8555679,8463964,16777215,0],[8556295,8463911,16777215,0],[8555719,8464070,16777215,0]],"interval_usec":8333},"ts":1570492754784}