DISCLAIMER: I shall not be held responsible for any damage or loss of data resulting from your foolishness in running the following command.
I recently stumbled upon (and foolishly ran) a command that filled up all of my system’s memory:
$ yes $(yes)
It didn’t take very long for my memory to fill up. I tried ^C, ^\ and executing a $ killall yes and it failed to kill the process. When I tried to reboot,
journalctl complained of being out of memory. I eventually had to reboot my system using the Magic SysRq key sequence REISUB (am I ever glad I have my Unicomp keyboard!)
So, why will this command fill up your memory?
Allow me to break down the function:
- Indicates that this command should be run as a regular user (i.e. without root privileges). This isn’t actually part of the command and shouldn’t be included when typing it into the shell.
- From the man page: “output a string repeatedly until killed”. By default, it outputs
- This is a feature in bash which allows one to build commands using the output of another command. The command inside the
()is executed and its output is inserted into the outer command. For example, $ mkdir "$(date)" becomes something like $ mkdir "Mon Feb 3 16:04:57 EST 2014" (if you haven’t it figured out, this creates a directory with the current date and time).
Have you figured out what it does? $(yes) is the bit that will fill up your memory. $() waits until the command has finished and will store the output in memory until it’s ready, but the problem is, yes will never finish until you kill it, thus a constant stream of
y will be stored until your memory runs out. The outer yes command will never execute unless you find a way to terminate the inner yes process.
While doing the SysRq+E keystroke (send
SIGTERM to all processes) of the SysRq sequence, I found out why I couldn’t kill the inner command with $ killall yes: the process I needed to kill was
bash is the process that handles the execution of
bash was the one I needed to kill.
Don’t try this on a Mac; if you do, your only option may be to unplug your machine. Holding down the power button may work, or maybe OS X will try to terminate Terminal, but I wouldn’t count on it.