杀死child_process时避免生成核心文件

我有一个节点脚本,启动一个mongod和一个node进程。 我在侦听SIGINT的脚本中设置了一个进程监听器,以防使用Ctrl-C取消。 然后监听器使用child_process#kill()child_process#kill()这两个进程

这一切都有效,但是它几乎总是从mongod进程生成一个core文件。 我想避免创build这个文件。 我将如何做到这一点? (是的,我知道我可以发出一个文件系统调用来删除它)。

产量

 ^C[mongod] 2017-07-23T09:23:07.181+0200 I CONTROL [signalProcessingThread] got signal 2 (Interrupt), will terminate after current cmd ends 2017-07-23T09:23:07.181+0200 I NETWORK [signalProcessingThread] shutdown: going to close listening sockets... 2017-07-23T09:23:07.181+0200 I NETWORK [signalProcessingThread] closing listening socket: 6 2017-07-23T09:23:07.181+0200 I NETWORK [signalProcessingThread] closing listening socket: 7 2017-07-23T09:23:07.181+0200 I NETWORK [signalProcessingThread] removing socket file: /tmp/mongodb-23451.sock 2017-07-23T09:23:07.181+0200 I NETWORK [signalProcessingThread] shutdown: going to flush diaglog... 2017-07-23T09:23:07.181+0200 I FTDC [signalProcessingThread] Shutting down full-time diagnostic data capture Caught SIGINT. Exiting gracefully ... 

当使用kill系统调用时,应该避免发送默认操作是以一个核心转储终止的信号(参见http://pubs.opengroup.org/onlinepubs/9699919799/basedefs/signal.h.html )。

如果您不发送此类信号,则可以通过将核心转储上的进程限制设置为0来消除核心转储。

这是通过rlimit系统调用来完成的,但是由于NodeJs可能没有API,所以你可以通过在shell中产生subprocess来获得相同的结果,你可以用ulimit -c 0来设置限制(限制是由subprocessinheritance)。

例:

 const child_process = require('child_process') const child = child_process.spawn("ulimit -c 0; sh -c 'kill -ABRT $$'; ls core", [], {shell: true }); child.stdout.pipe(process.stdout); child.stderr.pipe(process.stdout); 

如果你运行以上:

rm -f核心; nodejs the_script.js

它应该输出:

 Aborted ls: cannot access core: No such file or directory 

如果您不想在nodejs创build的进程层次结构中的任何位置进行核心转储,则可以在启动nodejs之前设置ulimit -c 0