2018年05月16日

Node-REDを仕込んだ環境にアクセスできなくなってしまった

昨日、Node-REDにちょっと重い処理(ffmpegによるファイル変換)を仕込んで、タイマ起動させるようにしました。

で、今日、実行状態はどうかな?と覗こうとしたら…、ポート番号1880にアクセスできない。応答が返ってこない。
さらに、2つのタスクが同時実行される時間になっても、2つ目のタスクが実行されない。
1つ目が終わるのを待ってから2つ目が実行されたので、遅延実行。
これはマズイな…。

よくよく調べてみたら、Node-REDの実行はシングルタスクが基本。
2つ目のタイマーは1つ目の処理が終わってから処理開始となる。

ただ、Node-REDの管理画面まで開けなくなっちゃうのは、ちょっとマズイな。

とりあえず、いったんは従来通りのcron+シェルスクリプトによる実行に戻すとして、今後Node-REDを活用していくとした場合は、重い処理がNode-REDの外で実行されるよう、「重い処理の場合、Node-REDはシェルスクリプトをキックするだけの役目に徹する」ような構成に見直さなければならないか。

続きを読む
posted by ayacy at 00:00 | Comment(0) | TrackBack(0) | プログラミング

2018年05月15日

さっそくNode-REDの書き方で躓いてしまった…。定数的な変数の保持と再利用ってどうすんだろ

昨日、Node-REDを覚えたので使いたいなぁ…なんてことを何気なく書きまして、色々実験していました。
現在、自宅内のRaspberry Piで行わせている処理の中に次のような流れのものがあります。

(cronで特定の日付日時で起動開始)
  1. 特定のIDと本日日付時刻を利用して作成した文字列でファイル名を作成し、変数Aにファイル名に入れる。
  2. ffmpegで音声ファイルをm4aファイルに変換し、変数Aの名称で保存する。
  3. 変数Aの名称のファイルを、scpでサーバ上へアップロードする。

実際にはもう少し複雑なことをやっていますが、単純かして上のような流れです。これを、Node-RED化したい。
考えた流れは次の通り。

injectで特定のIDを文字列として日時指定起動。
1でファイル名を作成し、msg.payloadに入れる。
2は[exec]でffmpegを実行し、出力ファイル名はmsg.payloadを引数として渡すようにする。
3は[exec]でsshpass&scpを実行し、転送元ファイル名を………どうやって渡そうか……?

いきなり困ってしまった。2でmsgは[exec]の出力(標準出力か、標準エラー出力か、戻り値)になってしまっているので、それを3に渡すことはできない。
何かmsg.payloadを保存しておく方法は無いか…と考えて、globalというものがあることを知った。


injectで特定のIDを文字列として日時指定起動。
1. ファイル名を作成し、msg.payloadに入れる。
2. msgをglobal内の変数に保管する。
3.[exec]でffmpegを実行し、出力ファイル名はmsg.payloadを引数として渡すようにする。
4.globalからmsgに変数に内容を復元。
5.[exec]でsshpass&scpを実行し、転送元ファイル名はmsg.payloadを引数として渡すようにする。

と、これで上手くいきそう。

と思ったのだが、よくよく考えてみたら、この流れは最大3多重で発生する可能性がある。つまり、後から実行された流れがglobalに保存したmsgを上書きしてしまう。コレじゃダメだ。

調べてみると、uuidを設定してその値ごとに保存/復元する方法等、いくつか方法はあるらしいけど、なんだか元々のシェルで書く方法より難しくなりそうな気がしてきた。できれば、こういった技術は物事を単純化させるために使いたい。

うーん、こういう混み入った場合の書き方のベストプラクティスを収集しておく必要がありそうだなぁ。

続きを読む
posted by ayacy at 00:00 | Comment(0) | TrackBack(0) | プログラミング

2018年05月14日

せっかくNode-REDを覚えたので家庭内インフラの実行環境を切り替えたい

先日、Node-REDの使い方を覚えてきました。こりゃ面白い。

現在、家庭内インフラの処理はほぼ、シェルスクリプトで作っちゃっているのですが、あまりエンジニアリング的なことができていないのが実情。仕事じゃないし。ならいっそのこと、Node-REDに移行できるところは移行したい。

ただちょっと心配なのは、メモリ使用量。
Node-REDはメモリを大きく食うそうなので。

いちおう、手元のRaspberry Pi 3(model B)は1GBのメモリを搭載していること、Raspberry PiのNode-REDではnode-red-startコマンド内でメモリ256MBに制限するパラメタが指定されていることとを勘案すれば、すぐにメモリが足りなくなることはないと思いますが、現在の運用では、金曜日の深夜にffmpegを3つ同時に立ち上げている部分があるので、このときに足りなくなるんじゃないかと、ちょっと心配。事前検証した方が良さそうな気がしています。


続きを読む
posted by ayacy at 00:00 | Comment(0) | TrackBack(0) | PC