質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Node.js

Node.jsとはGoogleのV8 JavaScriptエンジンを使用しているサーバーサイドのイベント駆動型プログラムです。

Windows

Windowsは、マイクロソフト社が開発したオペレーティングシステムです。当初は、MS-DOSに変わるOSとして開発されました。 GUIを採用し、主にインテル系のCPUを搭載したコンピューターで動作します。Windows系OSのシェアは、90%を超えるといわれています。 パソコン用以外に、POSシステムやスマートフォンなどの携帯端末用、サーバ用のOSもあります。

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

Wireshark

Wireshark(ワイヤシャーク)は、ネットワーク・アナライザソフトウェアです。 IP、DHCPなど800以上のプロトコルを解析できる機能があり、 Windows、Linux、BSD、Mac OS Xなどで利用が可能です。

Q&A

1回答

2259閲覧

child_processから起動したコマンドラインからログが出力されるたびにリアルタイム処理を行いたい

Dolphiiiin

総合スコア19

Node.js

Node.jsとはGoogleのV8 JavaScriptエンジンを使用しているサーバーサイドのイベント駆動型プログラムです。

Windows

Windowsは、マイクロソフト社が開発したオペレーティングシステムです。当初は、MS-DOSに変わるOSとして開発されました。 GUIを採用し、主にインテル系のCPUを搭載したコンピューターで動作します。Windows系OSのシェアは、90%を超えるといわれています。 パソコン用以外に、POSシステムやスマートフォンなどの携帯端末用、サーバ用のOSもあります。

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

Wireshark

Wireshark(ワイヤシャーク)は、ネットワーク・アナライザソフトウェアです。 IP、DHCPなど800以上のプロトコルを解析できる機能があり、 Windows、Linux、BSD、Mac OS Xなどで利用が可能です。

0グッド

0クリップ

投稿2021/04/16 14:07

編集2021/04/17 15:16

前提・実現したいこと

child_processによって起動されたtsharkから新たにログが出力されるたびに、そのログを変数に格納、処理を行いたいです

プログラムの流れ

  • tsharkを起動
  • tsharkから新たにログが出力されたときに、ログを変数に格納、処理の実行
  • 次のログの出力を待機

tsharkから新たにログが出力されたときに、ログを変数に格納、処理の実行
この点についての実装の方法がわかりません

コード

tsharkは現在このようにnode.jsから実行しています

javascript

1const { exec } = require('child_process') 2exec('\"C:\Program Files\Wireshark\tshark.exe\" -i Wi-Fi -Y \"mqtt.topic\" -x');

補足情報(FW/ツールのバージョンなど)

Windows 10 Pro 64bit
Wireshark 3.4.3

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

child_process.execではなく、child_process.spawnを使うと実現できます。

exec ... プログラムの終了を待つため、出力をリアルタイムに扱えない。
spawn ... プログラムの終了を待たない。非同期に実行。

例)

#!/usr/bin/env node // プログラムの出力を扱う場合はexecではなく、spawnを利用 const { spawn, /*exec*/ } = require('child_process'); (async () => { // プログラム名 const program = 'tshark'; // プログラムの引数 const args = ['-i', 'wlp2s0', '-Y', 'http', '-x']; // プログラムを起動。プログラムの終了を待たずに戻ってくる const child = spawn(program, args, { // spawnのstdioオプション // [標準入力, 標準出力, 標準エラー出力] の形式で指定 // 'ignore' -> nulや/dev/null相当 // 'pipe' -> nodeプログラムで扱う場合はこれを指定 // 'inherit' -> このnodeプロセスのものをそのまま使う // そのほか ドキュメント参照 https://nodejs.org/api/child_process.html#child_process_options_stdio stdio: ['ignore', 'pipe', 'inherit'], }); // 標準出力が出力される毎にループを回す for await (const chunk of child.stdout) { // chunkは標準出力が出力するデータのまとまり // 行単位でもなんでもなく、バッファがいっぱいになるか、 // 出力が一段落したかなど、人としては予測ができない塊 console.log("*****"); console.log(String(chunk)); console.log("#####"); } })().catch(console.error);

※プログラムの引数は適宜置き換えて下さい。

ただ、これではコメントにも記載していますが、出力を扱えるタイミングが予想できないです。
readlineを使うと行単位の出力を扱えます。

#!/usr/bin/env node // プログラムの出力を扱う場合はexecではなく、spawnを利用 const { spawn, /*exec*/ } = require('child_process'); // 追加 const readline = require('readline'); (async () => { // プログラム名 const program = 'tshark'; // プログラムの引数 const args = ['-i', 'wlp2s0', '-Y', 'http', '-x']; // プログラムを起動。プログラムの終了を待たずに戻ってくる const child = spawn(program, args, { // spawnのstdioオプション // [標準入力, 標準出力, 標準エラー出力] の形式で指定 // 'ignore' -> nulや/dev/null相当 // 'pipe' -> nodeプログラムで扱う場合はこれを指定 // 'inherit' -> このnodeプロセスのものをそのまま使う // そのほか ドキュメント参照 https://nodejs.org/api/child_process.html#child_process_options_stdio stdio: ['ignore', 'pipe', 'inherit'], }); const lines = readline.createInterface({ input: child.stdout }); // 標準出力の行単位でループを回す for await (const line of lines) { console.log("*****", line, "#####"); } })().catch(console.error);

なお、tsharkのオプションで-T ekを指定すると通信が行単位でJSONとして出力されるので、より扱いやすそうでした。
なお、プログラムを非同期で扱うことになるので、同期での実行に比べエラー処理等の難易度が上がります。頑張って下さい!

投稿2021/04/21 12:18

yskszk63

総合スコア161

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問