我在编写 Python 代码方面表现不错,但 BASH 对我来说相当陌生,我需要一些指导来选择高级方法来实现我的目标,即从实时流式 JSON 文件读取传感器数据并处理数据实时Python。
设置:我有一个运行 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 子进程模块将命令传递给它。然而,这看起来很复杂,我不确定 screen 命令是完成这里工作的最佳工具。想法?
下一个问题: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}