###前提・実現したいこと
pythonからシェルスクリプトを実行するコードをNode.jsで書き直すことになりました。
シェルスクリプトには標準入力でJSONを渡しています。
以下のページを参考にしました。
https://nodejs.org/docs/latest-v8.x/api/child_process.html#child_process_child_process_spawn_command_args_options
https://nodejs.org/docs/latest-v8.x/api/stream.html#stream_writable_write_chunk_encoding_callback
###発生している問題・エラーメッセージ
標準入力を渡さない場合はシェルスクリプトが意図した通りに実行されました。
標準入力でシェルスクリプトにデータを渡そうとすると上手くいかず、下記のエラーメッセージが表示されるようになりました。
なぜか偶にエラーにならず実行されることもありますが、その場合はシェル側で標準入力が取得できず、標準入力を渡さず実行した場合と同じ結果になりました。
events.js:183 throw er; // Unhandled 'error' event ^ Error: write EPIPE at _errnoException (util.js:1022:11) at WriteWrap.afterWrite [as oncomplete] (net.js:867:14)
###該当のソースコード
$ node test.js
で実行しています。
javascript
1// test.js 2const path = require('path') 3const spawn = require('child_process').spawn 4 5const script = path.resolve(__dirname, 'path', 'to', 'script') 6const data = { 7 name: 'foo', 8 age: 999 9} 10 11const child = spawn(script) 12child.stdin.write(JSON.stringfy(data), 'utf8') 13child.stdin.end()
ちなみにpythonでは以下のようなコードで、意図した通りの動作が確認できました。
python
1from os import path 2import subprocess 3import json 4 5SCRIPT = path.join( 6 path.dirname(path.abspath(__file__)), 7 'path', 'to', 'script' 8) 9DATA = { 10 name: 'foo', 11 age: 999 12} 13 14subprocess.run( 15 [SCRIPT], 16 input=json.dumps(DATA).encode('utf-8'), 17 check=True 18)
シェルスクリプトは以下のような感じです。直接実行してもpythonから実行しても問題ないので標準入力の受け取り方に問題があるとは思えませんが、念のため載せておきます。
bash
1#!/bin/bash 2 3if [ ! -p /dev/stdin ]; then 4 # 標準入力から何も渡ってこない場合はエラー 5 exit 1 6fi 7 8# 実行したい処理 9do_something -r '...' < /dev/stdin | # 続く...
###試したこと
child.stdin.write()
の戻り値を調べるとtrue
でした。callbackも引数に渡すと、それが実行された上で上記のエラーが発生するようです。
spawn(script)
をspawn('cat')
にしてchild.stdout.on('data', data => console.log(data))
で標準出力を表示したら、エラーは発生せずに標準入力に渡したJSONがそのまま表示できました。
###補足情報(言語/FW/ツール等のバージョンなど)
OS: Ubuntu16.04
Node.js: v8.9.4
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。