I am writing an application that spawns a child process and interacts with 
it via STDIN/STDOUT/STDERR through the life of the program.

When I run my script (the one that Node.JS spawns) from the terminal, it 
waits for user input, as expected.  In addition, if I write a short C 
script that spawns the process via *execvp* (the same way that Node seems 
to do it under the hood), the program waits for user input.  However, when 
I use Node's API, the process is killed soon after it is created, perhaps 
when it starts waiting for input.  Consider the code:

var spawn = require("child_process").spawn;
var shell = spawn("./run_shell.sh");

// Write the child's STDOUT to the main STDOUT
shell.stdout.on("data", function(data){
console.log(data.toString("utf8"));
});

// Listen for the exit event
shell.on("exit", function(code){
console.log("Exited with code "+code);
});

// Detect signals on the child process (for debugging)
var allSignals = ["SIGHUP", "SIGINT", "SIGQUIT", "SIGILL", "SIGABRT", 
"SIGFPE", "SIGKILL", "SIGSEGV", "SIGPIPE", "SIGALRM", "SIGTERM", "SIGUSR1", 
"SIGUSR2", "SIGCHLD", "SIGCONT", "SIGSTOP", "SIGTSTP", "SIGTTIN", 
"SIGTTOU", "SIGBUS", "SIGPOLL", "SIGPROF", "SIGSYS", "SIGTRAP", "SIGURG", 
"SIGVTALRM", "SIGXCPU", "SIGXFSZ", "SIGIOT", "SIGEMT", "SIGSTKFLT", 
"SIGIO", "SIGCLD", "SIGPWR", "SIGINFO", "SIGLOST", "SIGWINCH", "SIGUNUSED"];
for(var i=allSignals.length-1; i>=0; i--){
var signal = allSignals[i];
shell.on(signal, (function(signal){
return function(){ console.log(signal+" received by child"); };
})(signal));
}

When I run the above application, all I get is the lines of my *run_shell.sh
* before that script starts waiting for STDIN, and then a "Exited with code 
0".  No signals are detected.

This behavior is *not* exhibited with *all* programs that wait for input on 
STDIN.

It it is important, my shell script involves the use of an SELinux sandbox, 
and the issue is exhibited only when SELinux is in enforcing mode.  (When 
run outside of Node, the script works as expected regardless of whether 
SELinux is running.)

When I run the application in debug mode, when the following line (in *
child_process.js*) is run, I can tell by monitoring the shell's process 
that the script starts and exits, even when the debugger keeps Node paused:

*915   var r = this._handle.spawn(options);

The debugger won't let me step inside that method.  I assume this is 
because that particular method is an entrypoint into the C++ backend of 
Node.

What might be causing Node to kill the process?  How could I go about 
debugging to find out what part of Node is the culprit?  Thanks!

-- 
-- 
Job Board: http://jobs.nodejs.org/
Posting guidelines: 
https://github.com/joyent/node/wiki/Mailing-List-Posting-Guidelines
You received this message because you are subscribed to the Google
Groups "nodejs" group.
To post to this group, send email to [email protected]
To unsubscribe from this group, send email to
[email protected]
For more options, visit this group at
http://groups.google.com/group/nodejs?hl=en?hl=en

--- 
You received this message because you are subscribed to the Google Groups 
"nodejs" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to [email protected].
For more options, visit https://groups.google.com/groups/opt_out.


Reply via email to