Few days ago I set up my Vagrant virtual machine to be used for work. At Cermati, we use Redis as our key-value storage. After I successfully installed Redis, I notice there’s a weird thing about managing the daemon using
service in my Ubuntu 14.04 VM. When I did
ps aux | grep redis, I saw the daemon listed but when I run
service redis_6379 status, it said that redis was not running. It seemed that the redis daemon could not be managed using
After some time tinkering, I finally opened the init script in
/etc/init.d/redis_6379 and took a look at the code. This was actually the first time I dig into an init script so upon reading the code, I did not recognize some of the commands like
status-of-proc. I searched and found this article really helpful in understanding basic init scripts stuff. What particularly relevant to my issue were those two commands:
status-of-proc. Upon RTFM, I found out that:
- Starting daemon with
start-stop-daemonwill create a pidfile containing the PID of the daemon process.
status-of-procwill check for a status of a daemon by reading the pidfile and compare its content with the actual PID. If these two match, the daemon is reported as running. Otherwise, the daemon is not running.
- Stopping daemon with
start-stop-daemonwill delete the pidfile.
So my issue was very likely related to this pidfile. The default location of redis pidfile is
/var/run/redis/6379.pid and when I checked, no
/var/run/redis/ existed. So I created the directory, killed my redis daemon process, and started it again with
sudo service redis_6379 start. However, the issue still persisted. After a little bit of searching, I found someone with the same issue. It turned out that the directory permission had not been set properly. Setting the ownership to user
redis did the trick and I finally could manage my redis daemon with
But the problem was not over. When I powered off the VM and turned it on again, redis was listed in
ps aux | grep redis but
service redis_6379 status said redis was not running. What happened? Another searching and I figured out that
/var/run/ is a temporary directory. Meaning that its content will be destroyed on shutdown. Thinking for a while, I had two solutions in mind:
- Write an init script to be run before redis daemon is started to create
- Use another directory for pidfile.
I chose the last option since it is just a matter of changing one line in the redis configuration file and one line in the redis init script. I created
$HOME/.redis/ and tell redis to use that directory to store its pidfile. And now the problem is solved :-)