我有一个 Node 脚本,它启动一个 mongod
和一个 node
进程。我在脚本中设置了一个进程监听器来监听 SIGINT
,以防我应该使用 Ctrl-C
取消。然后监听器使用 child_process#kill()
杀死另外两个进程
这一切都有效,但它几乎总是最终从 mongod
进程生成一个 core
文件。我想避免创建这个文件。我该怎么做? (是的,我确实意识到我可以发出文件系统调用来删除它)。
输出
^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 生成子进程来实现相同的结果,您可以在 shell 中设置使用 ulimit -c 0
进行限制(该限制由子进程继承)。
示例:
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 创建的进程层次结构中的任何位置进行核心转储,则可以在启动 nodejs
之前设置 ulimit -c 0
。
关于node.js - 杀死child_process时避免生成核心文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45262640/