Why does HHVM in daemon mode not start automatically after server reboot?

Sliq picture Sliq · Feb 21, 2014 · Viewed 10.2k times · Source

HipHop/HHVM can be run as a daemon (so it starts automatically after rebooting) with

sudo /usr/bin/hhvm --mode daemon --config /etc/hhvm/server.hdf

When run, it works perfectly (which shows that the configs are okay). But after restarting the machine HHVM is gone and needs to be restarted manually. The above line incl. the configs have been taken out of official tutorials of the HHVM creators. Classic service syntax like sudo service hhvm start also works perfectly, but doesn't survice a machine restart.

What I've done to track down the problem:

The HHVM error log in /var/log/hhvm/error.log logs this line at each restart: Unable to open pid file /var/run/hhvm/pid for write. /etc/hhvm/server.hdf has PidFile = /var/run/hhvm/pid in first line. As this ships with HHVM by default, I don't want to change it. I think the sudo is the problem here. Without sudo HHVM won't run. Chmod 777'ing the pid file and pointing to another empty file don't solve the problem.

Question:

What's the correct way to install HHVM as a daemon ?

Answer

Sina picture Sina · Feb 22, 2014

The Manual Way

With reference to HHVM's own packaging material, you need to run hhvm as a daemon.

So, create a file at /etc/init.d/hhvm and paste this:

#! /bin/sh

test -x /usr/bin/hhvm || exit 0

case "$1" in
  start)
        /usr/bin/hhvm --config /etc/hhvm/server.hdf --user www-data --mode daemon
        ;;
  stop)
        start-stop-daemon --stop --quiet --oknodo --pidfile /var/run/hhvm/pid
        ;;

  reload|force-reload|restart|try-restart)
        $0 stop
        $0 start
        ;;

  status)
        echo "No status"
        ;;

  *)
        echo "Usage: /etc/init.d/hhvm {start|stop|restart|status}"
        exit 1
esac

exit 0

Now, we need to create the /etc/hhvm/server.hdf file. Here is a sample file: https://gist.github.com/sinaa/9151973

And for the /usr/share/hhvm/hdf/static.mime-types.hdf file, use this: https://github.com/hhvm/packaging/blob/master/hhvm/deb/skeleton/usr/share/hhvm/hdf/static.mime-types.hdf

And finally, create the directories:

  • /var/run/hhvm
  • /var/log/hhvm

And now simply start hhvm as a service: /etc/init.d/hhvm restart


The Automated Way: Installing pre-built packages (Ubuntu)

HHVM by default comes with all above, if you are using a pre-built version. You can install it as below (source):

# If this command is not found then do this: sudo apt-get install python-software-properties
sudo add-apt-repository ppa:mapnik/boost
sudo apt-key adv --recv-keys --keyserver hkp://keyserver.ubuntu.com:80 0x5a16e7281be7a449
echo deb http://dl.hhvm.com/ubuntu precise main | sudo tee /etc/apt/sources.list.d/hhvm.list
sudo apt-get update
sudo apt-get install hhvm

After reboot

To get your service to automatically run on boot, run this command:

sudo update-rc.d hhvm defaults