Skip to content
This repository has been archived by the owner on Dec 20, 2023. It is now read-only.

Should never killall -9 a mongod #6

Closed
pzrq opened this issue Mar 14, 2017 · 3 comments
Closed

Should never killall -9 a mongod #6

pzrq opened this issue Mar 14, 2017 · 3 comments

Comments

@pzrq
Copy link
Contributor

pzrq commented Mar 14, 2017

What this repo does is:

https://github.com/mongodb-js/kill-mongodb/blob/15cf3f9/index.js#L7

Which is according to our docs exactly what it should not do.

Using kill -9 (SIGKILL) basically guarantees that the mongod has no chance to trap the interrupt and do important things like flush your data to disk in a consistent (i.e. not corrupted) state.

From Ruthlessly Murdering a Process:

Who's idea was this?!
It has come to my attention that there is a great wave of people out there that think using 'kill -9' on everything is a great idea. Who are these people and how did they acquire such an insidious habit? I wish I knew.

Signals
There exists in Unix a thing called a signal. There are many types of signals that are sent to processes for a great variety of reasons. When a process receives a signal, it may ignore it or catch the signal and execute a "signal handler". This is called "trapping" a signal. Untrapped signals have a default action, which are basicly "do nothing" or "exit". There are two signals that are untrappable, "SIGKILL" and "SIGSTOP".

There is a command line utility called 'kill' that simply sends a signal to a process. 'kill -signal pid' will send signal to pid. 'kill -l' will list all of the available signals. You'll notice each signal has a number and a symbolic name. There are three signals commonly used to make a process exit: SIGTERM (15, terminate), SIGINT (2, interrupt), and SIGKILL (9, kill, untrappable, "El Diablo").

Processes Exiting
Most programs require some sort of cleanup when it exits. These programs setup a signal handler to perform these cleanup duties as a result of SIGTERM and SIGINT. They would setup a signal handler for SIGKILL if they could, but SIGKILL is untrappable.

If a program decided to trap the TERM or INT signals, then it would most likely delete any temporary files, shutdown sockets, remove shared memory segments, close open files, or some other task. For instance, MySQL needs to flush data to disk and close its database files. Killing MySQL with -9 will corrupt your databases. Most user apps that work on some binary formatted data files require temporary files, using kill -9 on these apps would leave around these temporary files. Network daemons need to flush their logs and properly shutdown Internet sockets so that clients aren't left hanging. Killing your web browser can corrupt your bookmarks file, cache files, leave temp files in /tmp (remember that 20MB mpeg you clicked on? yah, it's still sitting in /tmp)

Using kill -9 on a process is like just hitting the power button on your running PC. You already know that powering off a running PC can damage your filesystem because of run-time inconsistent data, why would you do the same thing to your applications? You risk the exact same data corruption.

HOWTO
Therefore, so that your important applications may close themselves, it is very important you follow this procedure when killing them:

kill pid (sends a TERM, wait 5 seconds)
kill pid (yes, try again, wait 5 seconds)
kill -INT pid (wait for it)
kill -INT pid (damn, still not dead?)
kill -KILL pid (same thing as -9)
kill -KILL pid (something is wrong)
If the process is still running, then stop sending it signals. It's either stuck in I/O wait or it's Defunct. 'ps auxw | grep processname', if you see it's in state D, then kill its parent process (the 3rd column of 'ps -ef' is the parent pid). If it's in I/O wait, then you have a deeper system problem. Most home users will never have this problem.

@imlucas
Copy link
Contributor

imlucas commented Mar 14, 2017

Thanks, @pzrq. I'd be happy to review any pull request from you with an alternative.

pzrq added a commit that referenced this issue Mar 15, 2017
As per the current MongoDB docs and issue:
https://docs.mongodb.com/v3.4/tutorial/manage-mongodb-processes/#use-kill
#6

Just not sure about possible downstream users of this, i.e. whether anyone using mongodb-runner for instance might be relying on it in some edge case. Perhaps a major semver bump?
pzrq added a commit that referenced this issue Mar 15, 2017
As per the current MongoDB docs and issue:
https://docs.mongodb.com/v3.4/tutorial/manage-mongodb-processes/#use-kill
#6

Just not sure about possible downstream users of this, i.e. whether anyone using mongodb-runner for instance might be relying on it in some edge case. Perhaps a major semver bump?

EDIT: Probably not, as it's only a devDependency for now so probably not as big of a deal:
https://github.com/mongodb-js/runner/blob/414359f88d6f2f9d23badbbcaa6b2028f4445656/package.json#L58-L62
@addisonElliott
Copy link

This should be good to close now since a PR was merged, correct?

@pzrq
Copy link
Contributor Author

pzrq commented Apr 15, 2018

Yep, thanks for reminding me @addisonElliott 👍

@pzrq pzrq closed this as completed Apr 15, 2018
Sign up for free to subscribe to this conversation on GitHub. Already have an account? Sign in.
Labels
None yet
Projects
None yet
Development

No branches or pull requests

3 participants