私は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サブプロセスモジュールを介してコマンドを渡して別の画面で実行しようとしています。しかし、これは複雑に見え、画面コマンドが作業に最適なツールであるかどうかはわかりません。アイデア?
次の質問:JSONファイルの各オブジェクトは、6つのサンプルとタイムスタンプを含むパケットです。ストリーミングJSONファイルは毎秒20回追加されます。 JSONファイルには「[」で始まり、カンマで区切られたJSONオブジェクトが含まれています。問題はストリーミングなので、末尾の「]」がなく、カンマで終わるということです。
これまで、sedを使用してJSONファイルの最後のコンマを「]」に置き換えるこのコマンドを考えました。ジャックJSON オブジェクトを 1 行に 1 つのオブジェクトとして認識し、書式設定する機能です。
sed "$ s/,/]/g" log.json | jq -c '.[]' | tail -F >> simpler_log.txt
ただし、Pythonまたはbashスクリプトで停止するように指示するまで、この行を実行し続けたいと思います。理想的には、tail -fのトレースを使用して、同じ行が2回読み取られるのを防ぎます。この問題をどのように解決するのですか?それとも、この部分を変えるべきですか?
最後の質問:このデータを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}