前提・実現したいこと
OS:Linux
言語:node.js
上記環境でmkfifoコマンドにより作成した名前付きパイプに書き込んだ文字列を
指定の端末およびログファイルにリダイレクトするプログラムを作成したいと思っています。
発生している問題・エラーメッセージ
端末およびログファイルへのリダイレクトは上手くいくのですが
プログラムが終了せず、Ctrl+Cで強制終了するしかない状態です。
プログラムを正常終了させる方法を教えていただけないでしょうか。
該当のソースコード
node
1const fs = require('fs'); 2const stream = require('stream'); 3 4const PIPE = 'mkfifoで作成した名前付パイプのパス'; 5const TTY = 'ttyコマンドで取得したパス'; 6const LOG = 'ログファイルのパス'; 7 8async function wait(msec) { 9 return new Promise((resolve, reject) => setTimeout(() => resolve(), msec)); 10} 11 12!async function main() { 13 // パイプ書込/読込ストリーム 14 const writer = fs.createWriteStream(null, {fd:fs.openSync(PIPE, 'w+')}); 15 const reader = fs.createReadStream (null, {fd:fs.openSync(PIPE, 'r+')}); 16 // 端末書込ストリーム 17 const tty = fs.createWriteStream(null, {fd:fs.openSync(TTY, 'w')}); 18 // ログ書込ストリーム 19 const log = fs.createWriteStream(null, {fd:fs.openSync(LOG, 'a')}); 20 // ストリーム分岐用 21 const hub = new stream.PassThrough(); 22 const wire1 = new stream.PassThrough(); 23 const wire2 = new stream.PassThrough(); 24 25 // ストリームを以下のように接続 26 // reader ---> hub ---> wire1 ---> tty 27 // ---> wire2 ---> log 28 reader.pipe(hub); 29 hub.pipe(wire1).pipe(tty); 30 hub.pipe(wire2).pipe(log); 31 32 // パイプに書き込み 33 writer.write('hello\n'); 34 35 // 1秒待機 36 await wait(1_000); 37 38 // 終了処理 39 console.log('----- EXIT -----'); 40 41 reader.push(null); 42 reader.read(0); 43 44 writer.end(); 45 writer.close(); 46 47 tty.end(); 48 tty.close(); 49 50 log.end(); 51 log.close(); 52}(); 53
試したこと
- main()の末尾で
process.exit()
を実行してもプログラムが終了しませんでした。 await wait(1_000);
をコメントアウトすると、プログラムは終了するのですがリダイレクトされませんでした。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2020/09/06 02:56
2020/09/06 09:54 編集
2020/09/07 00:18