Bước 1: Đảm bảo spawn
được gọi đúng cách
Đầu tiên, xem lại các tài liệu cho child_ process.spawn (lệnh, args, tùy chọn) :
Khởi chạy một quy trình mới với các đối số đã cho command
, với các đối số dòng lệnh trong args
. Nếu bị bỏ qua, args
mặc định là một mảng trống.
Đối số thứ ba được sử dụng để chỉ định các tùy chọn bổ sung, mặc định là:
{ cwd: undefined, env: process.env }
Sử dụng env
để xác định các biến môi trường sẽ hiển thị cho quy trình mới, mặc định là process.env
.
Đảm bảo bạn không đặt bất kỳ đối số dòng lệnh nào command
và toàn bộ spawn
cuộc gọi là hợp lệ . Tiến hành bước tiếp theo.
Bước 2: Xác định Trình phát sự kiện phát ra sự kiện lỗi
Tìm kiếm trên mã nguồn của bạn cho mỗi cuộc gọi đến spawn
, hoặc child_process.spawn
, tức là
spawn('some-command', [ '--help' ]);
và đính kèm một trình lắng nghe sự kiện cho sự kiện 'lỗi', để bạn được chú ý đến Trình phát sự kiện chính xác đang ném nó là 'Chưa xử lý'. Sau khi gỡ lỗi, trình xử lý đó có thể được gỡ bỏ.
spawn('some-command', [ '--help' ])
.on('error', function( err ){ throw err })
;
Thực thi và bạn sẽ nhận được đường dẫn tệp và số dòng nơi trình nghe 'lỗi' của bạn đã được đăng ký. Cái gì đó như:
/file/that/registers/the/error/listener.js:29
throw err;
^
Error: spawn ENOENT
at errnoException (child_process.js:1000:11)
at Process.ChildProcess._handle.onexit (child_process.js:791:34)
Nếu hai dòng đầu vẫn còn
events.js:72
throw er; // Unhandled 'error' event
làm bước này một lần nữa cho đến khi họ không Bạn phải xác định người nghe phát ra lỗi trước khi tiếp tục bước tiếp theo.
Bước 3: Đảm bảo biến môi trường $PATH
được đặt
Có hai tình huống có thể xảy ra:
- Bạn dựa vào
spawn
hành vi mặc định , vì vậy môi trường xử lý con sẽ giống như process.env
.
- Bạn đang tự do truyền một
env
đối tượng spawn
vào options
đối số.
Trong cả hai kịch bản, bạn phải kiểm tra PATH
khóa trên đối tượng môi trường mà quá trình con sinh ra sẽ sử dụng.
Ví dụ cho kịch bản 1
// inspect the PATH key on process.env
console.log( process.env.PATH );
spawn('some-command', ['--help']);
Ví dụ cho kịch bản 2
var env = getEnvKeyValuePairsSomeHow();
// inspect the PATH key on the env object
console.log( env.PATH );
spawn('some-command', ['--help'], { env: env });
Việc không có PATH
(nghĩa là nó undefined
) sẽ gây spawn
ra ENOENT
lỗi , vì sẽ không thể xác định được bất kỳ trường hợp nào command
trừ khi đó là đường dẫn tuyệt đối đến tệp thực thi.
Khi PATH
được đặt chính xác, tiến hành bước tiếp theo. Nó nên là một thư mục, hoặc một danh sách các thư mục. Trường hợp cuối cùng là bình thường.
Bước 4: Đảm bảo command
tồn tại trên một thư mục của những người được xác định trongPATH
Spawn có thể phát ra ENOENT
lỗi nếu tên tệp command
(nghĩa là 'some-command') không tồn tại trong ít nhất một trong các thư mục được xác định trên PATH
.
Xác định vị trí chính xác của command
. Trên hầu hết các bản phân phối linux, điều này có thể được thực hiện từ một thiết bị đầu cuối với which
lệnh. Nó sẽ cho bạn biết đường dẫn tuyệt đối đến tệp thực thi (như ở trên) hoặc cho biết nếu nó không được tìm thấy.
Ví dụ sử dụng mà và đầu ra của nó khi tìm thấy một lệnh
> which some-command
some-command is /usr/bin/some-command
Ví dụ sử dụng và đầu ra của nó khi không tìm thấy lệnh
> which some-command
bash: type: some-command: not found
các chương trình cài đặt sai là nguyên nhân phổ biến nhất cho lệnh không tìm thấy . Tham khảo từng tài liệu lệnh nếu cần và cài đặt nó.
Khi lệnh là một tệp script đơn giản, đảm bảo nó có thể truy cập được từ một thư mục trên PATH
. Nếu không, hãy chuyển nó sang một hoặc tạo liên kết đến nó.
Khi bạn xác định PATH
được đặt chính xác và command
có thể truy cập được từ nó, bạn sẽ có thể sinh ra quá trình con của mình mà không spawn ENOENT
bị ném.
exec
thay vì truyền vào lệnh làm đối số đầu tiên và các tùy chọn dưới dạng Mảng cho đối số thứ hai. ví dụ như tôi đang làmspawn( "adb logcat -c" )
thay vìspawn( "adb", [ "logcat", "-c" ] )
.