Apr 27, 2013

Having Nginx init.d script issues? It might be your comments.

I just updated to Nginx 1.2.8 on my dedicated server and even updated the init.d startup scripts at the same time (I had some custom-written scripts that needed updated). Well, I noticed a weird issue when I tried to restart Nginx:

➜  ~ /etc/init.d/nginx restart
Restarting nginx: nginxnginx: invalid option: "/var/run/"

So I checked the init.d script for Nginx... at the very top it had something like this:

PID=$(awk -F'[ ;]' '/[^#]pid/ {print $2}' /etc/nginx/nginx.conf)
if [ -z "$PID" ]

That's perfectly valid code... so I ran "awk -F'[ ;]' '/[^#]pid/ {print $2}' /etc/nginx/nginx.conf" in my zsh prompt:

➜  ~ awk -F'[ ;]' '/[^#]pid/ {print $2}' /etc/nginx/nginx.conf

Obviously, this isn't what $PID should be returning... it should be returning "/var/run/"... where's the set coming from? So I checked "/etc/nginx/nginx.conf" and I wrote this:

# set the pid of nginx
pid /var/run/;

So that one comment above it threw off awk when it was searching for "pid". As I'm too lazy to re-write the script, I just changed my "pid" in my comment to "process id". I'd rewrite the regular expression and have it check for comments correctly, but I have not bothered learning how awk works. Scratch that... as I'm an open source fanatic, I just spent some time figuring out how to get it to work with awk. There might be a better way to do it, but this is how I finally fixed this:

awk -F'[ ;]' '$1 !~ /^#/ && /pid/ {print $2}' /etc/nginx/nginx.conf

I'll contribute the code to Dotdeb-Nginx and see if they'll put the fix in place so it doesn't crash anyone else's Nginx startup script...


Let @tjasko know on Twitter!

Stalk me on social media! Any other way would just be creepy…