my nodejs script is not exiting on its own after successful execution

后端 未结 5 1159
爱一瞬间的悲伤
爱一瞬间的悲伤 2020-12-14 15:12

I have written a script to update my db table after reading data from db tables and solr. I am using asyn.waterfall module. The problem is that the script is not getting exi

相关标签:
5条回答
  • 2020-12-14 15:42

    We can quit the execution by using:

    connection.destroy();
    
    0 讨论(0)
  • 2020-12-14 15:43

    You have to tell it when you're done, by calling

    process.exit();
    

    More specifically, you'll want to call this in the callback from async.waterfall() (the second argument to that function). At that point, all your asynchronous code has executed, and your script should be ready to exit.

    EDIT: As pointed out by @Aaron below, this likely has to do with something like a database connection being active, and not allowing the node process to end.

    0 讨论(0)
  • 2020-12-14 15:49

    I just went through this issue.

    The problem with just using process.exit() is that the program I am working on was creating handles, but never destroying them.

    It was processing a directory and putting data into orientdb.

    so some of the things that I have come to learn is that database connections need to be closed before getting rid of the reference. And that process.exit() does not solve all cases.

    When my project processed 2,000 files. It would get down to about 500 left, and the extra handles would have filled up the available working memory. Which means it would not be able to continue. Therefore never reaching the process.exit at the end.

    On the other hand, if you close the items that are requesting the app to stay open, you can solve the problem at its source.

    The two "Undocumented Functions" that I was able to use, were

    process._getActiveHandles();
    process._getActiveRequests();
    

    I am not sure what other functions will help with debugging these types of issues, but these ones were amazing.

    They return an array, and you can determine a lot about what is going on in your process by using these methods.

    I just hope that helps anyone else stumbling across this post.

    0 讨论(0)
  • 2020-12-14 15:51

    You can use the node module why-is-node-running:

    1. Run npm install -D why-is-node-running

    2. Add import * as log from 'why-is-node-running'; in your code

    3. When you expect your program to exit, add a log statement:

    afterAll(async () => {
      await app.close();
      log();
    })
    

    This will print a list of open handles with a stacktrace to find out where they originated:

    There are 5 handle(s) keeping the process running
    # Timeout
    /home/maf/dev/node_modules/why-is-node-running/example.js:6  - setInterval(function () {}, 1000)
    /home/maf/dev/node_modules/why-is-node-running/example.js:10 - createServer()
    
    # TCPSERVERWRAP
    /home/maf/dev/node_modules/why-is-node-running/example.js:7  - server.listen(0)
    /home/maf/dev/node_modules/why-is-node-running/example.js:10 - createServer()
    
    0 讨论(0)
  • 2020-12-14 15:53

    If you use Visual Studio code, you can attach to an already running Node script directly from it.

    First, run the Debug: Attached to Node Process command:

    When you invoke the command, VS Code will prompt you which Node.js process to attach to:

    Your terminal should display this message:

    Debugger listening on ws://127.0.0.1:9229/<...>
    For help, see: https://nodejs.org/en/docs/inspector
    Debugger attached.
    

    Then, inside your debug console, you can use the code from The Lazy Coder’s answer:

    process._getActiveHandles();
    process._getActiveRequests();
    

    0 讨论(0)
提交回复
热议问题