2012-05-15 11 views
9

Vì vậy, tôi muốn chạy lệnh shell ở cuối chương trình node.js của tôi và đợi đầu ra/in nó trước khi thoát. Tôi đã thử process.on('exit',function(){}) và chạy lệnh con exec trong đó nhưng chương trình đã thoát trước khi gọi lại. Vì vậy, thay vào đó tôi sử dụng một đóng cửa trên process.exit nhưng tôi nhận được một số kết quả lạ. Thông tin cơ bản về mã là:Node.js chặn process.exit

process.exit = (function(old_exit){ 
    return function(code){ 
    var exec = require('child_process').exec; 
    var child; 
    child = exec("my shell command", function (error, stdout, stderr) { 
     if (error !== null) { 
     console.log('exec error: ' + error); 
     } 
     console.log(stdout); 
     //I first had this as the concluding line: 
     old_exit.apply(process,arguments); 
     //and I also tried 
     old_exit.apply(process,[]); 
     //and even (which I know is not in the right scope) 
     old_exit(code); 
     //and also 
     process.exit = old_exit; 
     process.exit(code); 
    }); 
    } 
}(process.exit)); 

Mỗi một kết quả trên thực thi lệnh shell chính xác hai lần rồi thoát. Tôi cũng đã cố gắng không gọi bất cứ điều gì ở cuối và trong khi đó giữ nó để lệnh của tôi thực hiện chỉ một lần, quá trình treo thay vì thoát ra ở cuối. Trừ khi có một cái gì đó chỉ đơn giản là tôi đang thiếu tôi cảm thấy như những nỗ lực đầu tiên tôi đã old_exit.apply(process,arguments); sẽ là cách chính xác và không nên gọi mã của riêng tôi một lần nữa, nó. Tôi cũng đã cố gắng sử dụng những lời hứa đã không hoạt động (thậm chí nó không ném một lỗi để được giải quyết nhiều lần) và tôi đã thử sử dụng một boolean cho nếu nó đã được thiết lập nhưng điều đó không làm việc. Cuối cùng tôi thậm chí đã cố gắng ném một lỗi sau khi hoàn thành gọi lại nhưng điều này buộc process.exit được gọi lại sau khi lỗi. Bất kỳ ý tưởng?

+3

Sự kiện 'thoát' đã được xử lý, vòng lặp sự kiện không còn chạy nên bạn không thể làm bất cứ điều gì không đồng bộ từ cuộc gọi lại' thoát'. – ebohlman

+0

Điều đó được hiểu, nhưng có cách nào khác cho việc này không? – jayarjo

+0

Mặc dù đây là cũ bây giờ và tôi không cần nó nữa, tôi đã không cố gắng để làm một cái gì đó asynch từ callback thoát, tôi đã cố gắng để tránh hạn chế đó bằng cách chặn process.exit gọi chính nó để tôi có thể làm asynch của tôi và sau đó bắt đầu process.exit thực mà sẽ không cho phép asynch từ đó. Mặc dù chưa được kiểm tra nhưng tôi nghĩ ít nhất một trong những giải pháp trên có thể là giải pháp đúng và thực tế là xung đột với khung kiểm tra mocha cũng đang thực hiện công việc thoát khỏi quy trình đặc biệt gây ra các vấn đề cụ thể của tôi. – user1084563

Trả lời

10

Bằng thời gian process.exit, bạn đã quá muộn để làm bất cứ điều gì không đồng bộ. Tôi không nghĩ rằng bạn có thể nhận được xung quanh phần async, như bạn dường như cần phải thực hiện một lệnh shell. Bạn có thể nghe nhiều tín hiệu thoát khác nhau, thực hiện các công cụ không đồng bộ của bạn, sau đó gọi process.exit khi bạn đã sẵn sàng. Lưu ý rằng bạn sẽ nhận được tất cả các tín hiệu cho đến khi quá trình tồn tại, vì vậy bạn sẽ muốn theo dõi trạng thái để đảm bảo lệnh shell của bạn chỉ chạy một lần. Sau đây sẽ làm việc cho tín hiệu ctrl-c:

process.on('SIGINT', function() { 
    console.log('Received Signal'); 
    setTimeout(function() { 
     console.log('Exit'); 
     process.exit(1); 
    }, 10000); 
}); 
Các vấn đề liên quan