2015-12-04 17 views
6

Nếu chúng ta chia rẽ một child_process trong Node, làm thế nào chúng ta có thể chuyển các tham số nút tới child_process?Chuyển các cờ nút/arg đến tiến trình con

https://nodejs.org/api/child_process.html

Cụ thể tôi muốn đẻ trứng ~ 20 quy trình, và muốn giới hạn việc sử dụng bộ nhớ của mỗi bằng cách sử dụng --v8-tùy chọn, nhưng tôi không thể tìm thấy bất kỳ ví dụ để làm điều này - là điều này có thể hoặc làm các quá trình con giả sử các tham số nút giống như các phụ huynh?

phụ huynh sẽ là:

node foo.js 

và các em sẽ

node --some-flag=bar baz.js 

...

tôi tìm cách để vượt qua tùy chọn nút sử dụng

child_process.fork() 

nhưng nếu nó bật ly có thể với

spawn() 

hoặc

exec() 

sau đó tôi đoán tôi sẽ mất những gì tôi có thể nhận được.

Là một ví dụ đơn giản, sau đây sẽ không chạy Node.js với cờ --harmony

var cp = require('child_process'); 

    var args = ['--harmony']; 

    var n = cp.fork(filePath, args , Object.create(process.env)); 
+1

có vẻ như tài liệu ngã ba cho biết nó chấp nhận danh sách các arg quá https: // nodejs.org/api/child_process.html # child_process_child_process_fork_modulepath_args_options – dm03514

+0

Tôi nghĩ rằng các đối số đó chỉ chuyển đến chương trình của bạn, chứ không phải chính node.js, nói cách khác, các đối số đó không phải là V8, chỉ với chương trình của bạn –

+0

Tôi đã cố gắng cung cấp một ví dụ về tại sao nó không hoạt động trong OP –

Trả lời

10

Bạn sẽ cần phải thiết lập các tùy chọn execArgv-fork.

Nếu không, bạn sẽ nhận được tùy chọn tương tự như quy trình nút mà bạn đang 'giả mạo' (nó thực sự chỉ là spawn, không phải là một ngã ba POSIX).

Vì vậy, bạn có thể làm một cái gì đó như thế này:

var n = cp.fork(modname, {execArgv: ['--harmony']}); 

Nếu bạn muốn vượt qua vào nút-tùy chọn từ phụ huynh:

var n = cp.fork(modname, {execArgv: process.execArgv.concat(['--harmony'])} 

Cảnh báo:child_process có một bảo vệ chống lại -e chuyển đổi mà bạn đang phá vỡ với điều đó! Vì vậy, đừng làm điều này từ dòng lệnh với một số -e hoặc -p. Bạn sẽ tạo một quy trình mới với tập lệnh giống với tập lệnh từ cha mẹ - một quả bom ngã ba.

Nếu bạn vẫn muốn để có thể vượt qua về các lựa chọn đến ngã ba qua môi trường, bạn có thể làm một cái gì đó như thế này:

var cp = require('child_process'); 
var opts = Object.create(process.env); 
opts.execArgv = ['--harmony']; 

var n = cp.fork(filePath, opts); 

Một lựa chọn khác có thể thay đổi process.execArgv (như process.execArgv.push('--harmony')) nhưng tôi khá chắc chắn đó là một ý tưởng tồi và có thể dẫn đến hành vi lạ elswhere.

+0

cảm ơn câu trả lời và hiểu câu hỏi của tôi. Tôi sẽ thử nó. Tôi thấy không có lý do tại sao nó nên ít có thể làm điều đó với cp.fork() hơn với exec hoặc đẻ trứng trừ khi bạn có thể nghĩ ra một lý do chính đáng cho điều đó. –

+0

@AlexMills: [mã cho 'fork' là khá dễ đọc] (https://github.com/nodejs/node/blob/master/lib/child_process.js#L19) (ngoài phép thuật đối số trong lần đầu tiên dòng), về cơ bản nó là một chức năng thuận tiện cho đẻ trứng. Không có tất cả các phép thuật, nó giống như thế này: 'cp.spawn (process.execPath, (options.execArgs || process.execArgs) .concat ([moduleName], args), options)' vấn đề là args xuất hiện sau tên mô-đun, không phải trước đây. Họ đã nghĩ về điều đó và bạn có thể cung cấp args cho nút như một lựa chọn (như đã nêu trong tài liệu). –

+0

cố gắng xác nhận rằng công trình này, nhưng không thể tìm thấy cách đăng nhập cờ v8 nào đang được sử dụng bởi quy trình nút .. –

Các vấn đề liên quan