@@ -29,6 +29,7 @@ function run(key, proc, emitter) {
2929 args = [ '-c' , proc . command ] ;
3030 }
3131 var child = prog . spawn ( file , args , { env : proc . env } ) ;
32+ var killallReceived = false ;
3233
3334 child . stdout . on ( 'data' , function ( data ) {
3435 cons . log ( key , proc , data . toString ( ) ) ;
@@ -38,20 +39,35 @@ function run(key, proc, emitter) {
3839 cons . log ( key , proc , data . toString ( ) ) ;
3940 } ) ;
4041
41- child . on ( 'close' , function ( code ) {
42+ child . on ( 'close' , function ( code , signal ) {
4243 if ( code === 0 ) {
4344 cons . info ( key , proc , "Exited Successfully" ) ;
4445 } else {
45- cons . error ( key , proc , "Exited with exit code " + code ) ;
46+ cons . error ( key , proc , "Exited with exit code " + signal || code ) ;
4647 }
4748 } ) ;
4849
4950 child . on ( 'exit' , function ( code , signal ) {
50- emitter . emit ( 'killall' , signal ) ;
51+ if ( ! killallReceived ) {
52+ emitter . emit ( 'killall' , signal || 'SIGINT' ) ;
53+ }
5154 } ) ;
5255
5356 emitter . on ( 'killall' , function ( signal ) {
54- child . kill ( signal ) ;
57+ // Once this process has received a killall event, don't send another
58+ // such event to everyone. Let's assume that once is enough.
59+ killallReceived = true ;
60+
61+ try {
62+ child . kill ( signal ) ;
63+ }
64+ catch ( err ) {
65+ if ( err . code === 'EPERM' ) {
66+ // Means that the child runs with higher privileges than we are; we're
67+ // not going to be able to kill it in that state. Log and do nothing.
68+ cons . error ( key , proc , "Process has become unkillable; returns EPERM." ) ;
69+ }
70+ }
5571 } ) ;
5672
5773}
0 commit comments