Oops, I did it again

February 11th, 2007

The following post is pretty much just for *nix and mac users. One of the things I did most often when I first started using mongrel for development was start some app up, forget which one and close my terminal window. Now the process was still running so I would get the following error when I tried to fire up my next app on the same port:

Address already in use - bind(2) (Errno::EADDRINUSE)

Being new to the command line, the only way I figured out how to stop it was restart my computer. So uncool, I know. Knowing that this is something newbs run into, I thought I would post a way to fix your problem without restarting.

Let’s say you start up your app like so:

$ mongrel_rails start -d

The -d detaches the executed command from the current terminal but you can still find it in your processes list by typing:

$ ps aux

That will print out all of the currently running processes along with their PID (process identification number). On my system it spits out a big list so a simple trick to find the running mongrel process is:

$ ps aux | grep mongrel

The pipe (|) passes the output of ps aux into the grep search for mongrel. Botta bing bang boom. You now have the process id number (and can do a simple kill to stop it).

PID's

If the PID was 933, you could:

kill 933

You can now search for mongrel in the processes again and it should be gone. Note: If you used script/server to start mongrel, you’ll have to grep that instead of mongrel:

ps aux | grep script/server

10 Responses to “Oops, I did it again”

  1. evan Says:

    Note that your second PID is actually your grep process (now defunct), because it had mongrel as an argument.

    For me killall ruby usually does the trick though.

  2. Tim Blair Says:

    If you don’t want the grep process to show up I like the nifty trick of taking advantage of how regular expressions are parsed:

    ps aux | grep [m]ongrel

    Alternatively you can do the whole thing (including killing the process) in one go:

    ps aux | grep [m]ongrel | awk '{ print $2 }' | xargs kill -9

    You could extract this into a batch file:

    @#!/bin/sh ps aux | grep ”$1” | grep -v grep | awk ‘{ print $2 }’ | xargs kill -9@

    This could be run as follows to kill any mongrel processes:

    $ ./mykill mongrel

  3. Tim Blair Says:

    Hmm, silly textile hasn’t parsed that batch file code correctly. Ignore the at-symbols and putting a return in before ps aux (should be two lines).

  4. Gareth Howell Says:

    Why not just run mongel in a foreground window?

    I have screen installed on my Mac, which allows you to spawn multiple terminal sessions in a single window. I run mongel in one of them, irb in another, and the normal console in yet another.

    Gareth

  5. Michael Schuerig Says:

    Here’s what I’m using. The grep doesn’t list itself in the process list; save in /usr/local/bin/psgrep

    #! /bin/sh ps auxww | sed -n -e "1p; /sed -n -e/D; /psgrep/D; /$1/p"

  6. Mislav Says:

    I’m using this command to bump the Mongrel process I detached with script/server:

    
    alias bump='kill -USR2 `cat tmp/pids/mongrel.pid`'
    

    You have to be in your Rails app root to do this, though.

  7. N. Hao Ching Says:

    Why don’t you just use what the documentation says?

    mongrel_rails stop

    You can also use Eclipse and RadRails to manage your mongrel development servers.

  8. John Nunemaker Says:

    @evan – good point. i should have mentioned that.

    @Gareth – That is what I usually do.

    @N. Hao – This article is for when you detach the mongrel_rails start command from the terminal. I know that mongrel_rails stop works just fine.

  9. Sean Lynch Says:

    You can also use the command “top” on most *nix systems.

    It keeps a list of running processes that can be sorted by cpu, memory or other parameters. They can be for the whole system or for one user id.

    You can kill the job by PID from within top.

    Top is a very useful tool when running *nix.

    http://unixhelp.ed.ac.uk/CGI/man-cgi?top

    It should work on macs: http://www.apple.com/macosx/features/unix/

    “Command-line Environment UNIX users will feel at home in Darwin, the robust BSD environment that underlies Mac OS X. That environment is accessible at any time from the Terminal application. You can also run commands that don’t require arguments (such as top) by double-clicking them in the Finder. With the thousands of man pages included in Mac OS X, you can quickly find all your favorite UNIX tools.”

  10. Olivier Garcia Says:

    You can’t killall if you’re having several ruby processes on the same server. The way I handle such things is to lookup network connections thanks to the netstat command :

    
    netstat -pltn 2>/dev/null | grep THE_PORT_IN_USE 
    
    

    It will give you the process number of the server that use the port.

    Note : If you have several ruby processes on several network interfaces with the same port number (read big server/farm) you may end up with lines. (netstat is interessing : try netstat -alptuv).

Sorry, comments are closed for this article to ease the burden of pruning spam. If you have any further comments, just send me an email.