我有兩個腳本A.js和B.js,以及第三方應用程序(這是開源的)。腳本A.js使用execSync
啓動第三方應用程序。腳本B.js使用spawn
啓動腳本A.js。不能管,從產卵標準輸出爲特定應用程序
如果我運行本身腳本A.js,我可以看到第三方應用程序的整個輸出。當我通過運行腳本B.js間接運行它時,我只能看到一些輸出。
A.js
const { execSync } = require('child_process');
console.log("Hello");
execSync('mybinary.exe -arg1 -arg2', { stdio: 'inherit' });
B.js
const { spawn } = require('child_process');
const app = spawn(process.execPath, ['A.js'], {
stdio: ['inherit', null, 'inherit']
});
app.stdout.on('data', (chunk) => {
process.stdout.write(chunk);
});
當我啓動B,我只看到 「Hello」,然而二進制爲運行(這是一個服務器,我可以打開一個TCP連接到它)。我只是沒有看到輸出。當我自己啓動A時,我看到「Hello」和普通二進制輸出。
如果我改變B的標準輸出,以「繼承」,它的工作原理。
這究竟是爲什麼,以及如何解決這一問題?
更新:似乎與使用兩個腳本沒有任何關係。在不使用stdio繼承的情況下直接生成二進制文件會出現同樣的問題。似乎依賴於第三方應用程序。 如果程序只是打印到stdout,程序如何影響節點?
上下文:我想啓動服務器,然後在服務器準備就緒時運行命令。準備就緒後,服務器將打印出特定的消息。這個想法是等待這條消息被打印出來。打印出此消息後,它不會打印出任何其他內容,但它仍在運行。
我試圖管的具體可執行文件是一個ChatScript server。
UPDATE:在這一點上,我認爲它是與我試圖管道的特定二進制文件的東西。我想了解二進制文件如何影響這種行爲,即使用繼承而不是管道。 如果有人能重新與節點腳本(或C++程序),將回答這個問題。
環境
- 操作系統:Windows 10
- 控制檯:Cygwin的(並且也嘗試定期命令提示符)。
- 節點V7.10.0
注意,這是因爲這裏的同一個問題:node.js child_process.spawn no stdout unless 'inherit'
我有一種感覺就是這個問題。你知道爲什麼直接運行chatscript(節點外)爲什麼直接打印標準輸出?是否設置某種標誌來禁用(或降低)緩衝?你會看到它在一個簡單的windows cmd中可以在節點外打印。 – noahnu