2012-05-15 16 views
9

Tak więc chciałem uruchomić polecenie powłoki na końcu mojego programu node.js i czekać na wyjście/wydrukować je przed wyjściem. Próbowałem process.on('exit',function(){}) i uruchomiłem polecenie child exec, ale program został zakończony przed wywołaniem zwrotnym. Zamiast tego użyłem zamknięcia na process.exit, ale otrzymuję dziwne wyniki. Podstawy kodu:Proces przechwytywania Node.js

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)); 

Każdy z powyższych wyników wykonał moją komendę powłoki dokładnie dwa razy, a następnie zakończył działanie. Próbowałem też nie wywoływać czegokolwiek na końcu i podczas gdy trzymałem to tak, że moje polecenie zostało wykonane tylko raz, proces zawiesił się zamiast wyjść na końcu. O ile nie ma czegoś, czego po prostu brakuje, mam wrażenie, że pierwsza próba, jaką miałem old_exit.apply(process,arguments);, byłaby poprawna i nie powinien ponownie wywoływać mojego własnego kodu. Próbowałem również używanych obietnic, które nie działały (nawet nie spowodowało błędu, aby zostać rozwiązany wiele razy) i próbowałem użyć boolean dla, jeśli został ustawiony, ale to też nie działa. W końcu próbowałam nawet rzucić błąd po zakończeniu wywołania zwrotnego, ale ten wymuszony process.exit będzie wywoływany ponownie po błędzie. Jakieś pomysły?

+3

kiedyś 'WYPŁYNIĘCIE zdarzenie zostało przeładowane, pętla zdarzenie nie jest już uruchomiony, więc nie można nic asynchroniczne z' WYPŁYNIĘCIE zwrotnego zrobić. – ebohlman

+0

To jest zrozumiałe, ale czy jest jakiś inny sposób na to? – jayarjo

+0

Mimo, że jest już stary i już go nie potrzebuję, nie próbowałem zrobić czegoś asynch z wywołania wyjścia, próbowałem uniknąć tego ograniczenia, przechwytując process.exit wywoływanie samego siebie, abym mógł wykonać mój asynch a następnie zainicjować rzeczywisty process.exit, który nie pozwoli stamtąd asynch. Chociaż nietestowane myślę, że przynajmniej jeden z powyższych może być właściwym rozwiązaniem i faktycznie był to konflikt z ramą testową mokki, który również wykonywał specjalne działania wyjścia procesu, które powodowały moje szczególne problemy. – user1084563

Odpowiedz

10

Przez process.exit czas, jesteś za późno, aby zrobić coś asynchronicznego. Nie sądzę, abyś mógł ominąć część asynchroniczną, ponieważ najwyraźniej musisz wykonać polecenie powłoki. Możesz słuchać różnych sygnałów wyjściowych, robić rzeczy asynchroniczne, a następnie wywoływać proces. Wyłączyć się, gdy będziesz gotowy. Zauważ, że otrzymasz wszystkie sygnały, dopóki proces nie istnieje, więc będziesz chciał śledzić stan, aby upewnić się, że polecenie powłoki jest uruchamiane tylko raz. Następujące będzie działać na sygnał CTRL-C:

process.on('SIGINT', function() { 
    console.log('Received Signal'); 
    setTimeout(function() { 
     console.log('Exit'); 
     process.exit(1); 
    }, 10000); 
}); 
Powiązane problemy