June 25, 2008

Apache Won’t Start: No space left on device

Drew Stephens @ 2:10 pm — Tags: , , ,

I doing some development involving Apache handlers which involves lots of restarting it and occasionally Apache shutting down uncleanly. After numerous restarts, the webserver refused to start printing the following in the error log:

[Wed Jun 25 18:57:11 2008] [emerg] (28)No space left on device: Couldn't create accept lock

After being confused because there certainly is enough disk space, I Googled for other possibilities and it turns out I had hit another limit, that of active semaphores. When some of my processes were killed, they died uncleanly and didn’t clean up their open semaphores, filling the maximum number available to my user. It’s easy to tell that this is the root of the issue; running ipcs -s showed a list of 95 open semaphores. Clearing them up is just as easy:

~$ for id in `ipcs -s |awk '/USERNAME/ {print $2}'`; do ipcrm -s $id; done

That prints the list of semaphores, grabs the ID ({print $2}) for lines containing USERNAME (your own or that which the webserver runs under) and then ipcrm’s those semaphores.

June 12, 2008

Subversion diff with vimdiff

Drew Stephens @ 1:03 pm — Tags: , ,

Side by side diffs are much more legible and useful than those in unified format or any other linear diff. By default, the svn diff command presents output in the unified format, though it has an option, --diff-cmd, which allows you to specify the program that will perform the diff. Passing vimdiff as the diff command doesn’t work as the options passed by svn diff are a bit complicated:

~/code/perllib/MG$ cat foo.sh
#!/bin/bash
echo $*
~/code/perllib/MG$ svn diff --diff-cmd foo.sh Proxy.pm
Index: Proxy.pm
-u -L Proxy.pm (revision 21095) -L Proxy.pm (working copy) .svn/text-base/Proxy.pm.svn-base /tmp/svndiff.tmp

Subversion is telling diff to output context (-u), show pretty names for the files (-L) and then the two files to diff. To make this work with vim, we simply need to cut out the extra options. To do so, I wrote a simple script:

\#!/bin/bash
shift 5
vimdiff "$@"

I put that in ~/bin/svnvimdiff and now I can do svn diff --diff-cmd ~/bin/svnvimdiff Proxy.pm and view the diff in vimdiff. Since this is a command I use often, I aliased it in my .bashrc:

alias svndiffvim='svn diff --diff-cmd ~/bin/svnvimdiff'

June 10, 2008

Keeping Your Home Directory in Subversion

Drew Stephens @ 1:25 am — Tags: , ,

I’ve heard of doing this for a long time, but always figured it’d be a huge jump to put my home directory into a revision control system. For years I’ve scp’d files to a new machine when I moved in and when I made changes to my vimrc or ssh config, it was hell to propagate the changes to my other machines. No more is this an issue, since I’ve commited my home directory. The process is really quite trivial.

I first created a subversion repository on my Linux server. A special machine isn’t required, nor is root access; you just need somewhere that can be accessed with SSH from the intertubes.

~$ svnadmin create subversion

It’s as easy as that. To begin with, let’s create the standard subversion directory structure.

~$ svn co file://$home/subversion/ foo
~/foo$ cd foo
~/foo$ mkdir homedir
~/foo$ svn add homedir
~/foo$ svn commit
~/foo$ cd ..
~$ rm -rf foo

So now we have a repository with a homedir directory in the root; this is where all of the files from your home directory will be checked into the repository. To begin with, check out this new project into the root of your home directory.

~$ svn co file://$home/subversion/homedir .

Since there isn’t anything in there, nothing will actually be checked out, but subversion will setup source control on ., your home directory. So let’s add something to it. I have a .vimrc that ought to be identical across environments, so I’ll check that and my .vim support directory into the repository

~$ svn add .vim*
A         .vimrc
A         .vim/colors/drew.vim
A         .vim/plugin/feraltogglecommentify.vim
~$ svn commit -m "adding stuff for the first time!"

Easy as that, all of my vim configuration files are in subversion. Now for the awesome part. Like I mentioned, I have a number of machines and, things like vim configuration files should be the same on all systems. So now, I hop onto another machine and checkout the homedir project. First I remove the existing .vim* files since they will be replaced with the repository versions.

Caligula:~$ rm -rf .vim*
Caligula:~$ svn co svn+ssh://dinomite.net/home/dinomite/subversion/homedir .
A    .vim
A    .vim/colors
A    .vim/colors/drew.vim
A    .vim/plugin
A    .vim/plugin/feraltogglecommentify.vim
Updated to revision 1.

Bam. I’ve now got the exact same files on both machines. If I’m at the office and find some flash vim option that I want to use, I simply add it to my .vimrc, check it in with svn ci .vimrc and when I svn up from the other machines, they’ll get the new changes. In reality, I keep a bunch of stuff in my homedir subversion repository: .bashrc, .screenrc, bin directory and many others. Subversion helps me keep all of my config files in sync across a number of different machines that I use on a daily basis; if you use more than one system with any frequency, I highly suggest checking in your home directory.

Powered by WordPress