Repository navigation
SIGINT is not handled when a short-lived process is run in watch-mode #51466
Description
Activity
- added a commit that references this issue
on Jan 14, 2024 - addedwatch-modeIssues and PRs related to watch mode.Issues and PRs related to watch mode.
on Jan 15, 2024 Doing CtrlC is correctly terminating the process for me 🤔
Reacted by Duncan Chiu and azarashiCtrl C is terminating the process for me.
Oh! The
--watchoption was working fine in my environment as well.Sorry, I had oversimplified the reproduction conditions and made a mistake. We can actually reproduce this by specifying the entry point script in
--watch-path.$ vim index.js $ cat index.js console.log("test"); $ node --watch-path index.js index.js (node:1512205) ExperimentalWarning: Watch mode is an experimental feature and might change at any time (Use `node --trace-warnings ...` to show where the warning was created) test Completed running 'test.js' ^C^C^C^C^C^C^C
Also, this behavior only seems to work on Linux. Could not reproduce on Mac.
Reacted by Duncan Chiu@azrsh Could re-produce the issue at v22.0.0-pre. However, I found your use of --watch-path is wrong. The correct command should be "node --watch-path=./ index.js". If you run my command, It should work as fine. Though, I could see a possible new issue on flag parsing. For example, not correct option on --watch-path should be stopped.
In my environment, the command certainly works fine.
Does it mean that specifying a file instead of a directory in
--watch-pathis wrong?
I didn't find any such limitation written in the Node.js Command-line API documentation...github-actions commented
on May 24, 2026 on May 24, 2026 – with GitHub ActionsContributorMore actionsThis issue has been marked as stale due to 210 days of inactivity.
It will be automatically closed in 30 days if no further activity occurs. If this is still relevant, please leave a comment or update it to keep it open.- addedstaleIssues and PRs marked stale due to inactivity and scheduled for automatic closure.Issues and PRs marked stale due to inactivity and scheduled for automatic closure.
on May 24, 2026 github-actions commented
on Jun 24, 2026 on Jun 24, 2026 – with GitHub ActionsContributorMore actionsThis issue has been automatically closed after 30 days of inactivity following its stale status (no activity for a total of 240 days).
If this is still relevant, feel free to reopen it or leave a comment with additional details so we can continue the discussion.
Version
v20.11.0
Platform
Linux hostname 6.5.7-arch1-1 #\1 SMP PREEMPT_DYNAMIC Tue, 10 Oct 2023 21:10:21 +0000 x86_64 GNU/Linux
Subsystem
No response
What steps will reproduce the bug?
index.js.After following the above steps, you will no longer be able to terminate the Node.js process in watch-mode with
SIGINTorSIGTERM.How often does it reproduce? Is there a required condition?
If you follow the steps, it will always reproduce.
What is the expected behavior? Why is that the expected behavior?
A Node.js process in watch-mode will be terminated if we send
SIGINTorSIGTERMto the process, such as withCtrl + C.What do you see instead?
I input Ctrl + C but the input is ignored.
Additional information
Mechanism of this behavior
The cause of this behavior is the
killAndWaitfunction located in/lib/internal/main/watch_mode.js:69.Node.js process in watch-mode triggers a signal handler when it receives SIGINT or SIGTERM. In this signal handler, the
killAndWaitfunction is called as shown below.node/lib/internal/main/watch_mode.js
Line 134 in c25878d
At this time, since the argument
forceof thekillAndWaitfunction is set totrue, processing continues without satisfying the condition in the code path below of thekillAndWaitfunction.node/lib/internal/main/watch_mode.js
Lines 74 to 76 in c25878d
As a result, the
killAndWaitfunction will wait for a process that has already terminated to terminate. In other words, the wait never ends.node/lib/internal/main/watch_mode.js
Lines 77 to 79 in c25878d
My proposed modifications
Modify the
killAndWaitfunction so that ifexitedistrue, return thekillAndWaitfunction regardless of the value of the argumentforce.If you accept this modification, I can create a PR!
Thank you!