Install PhantomJS as a service on Ubuntu 12.04

Hello there,

I’ll show you how to install the headless webkit PhantomJS 1.9.7 on Ubuntu 12.04 and how to manage it as a system service.

Installation

The following lines will download the phantomjs archive, extract it and create the symbolic links to the binary in /usr/local/share/usr/local/bin and /usr/bin.

$ cd /usr/local/share
$ sudo wget https://bitbucket.org/ariya/phantomjs/downloads/phantomjs-1.9.7-linux-x86_64.tar.bz2
$ sudo tar xjf phantomjs-1.9.7-linux-x86_64.tar.bz2
$ sudo ln -s /usr/local/share/phantomjs-1.9.7-linux-x86_64/bin/phantomjs /usr/local/share/phantomjs
$ sudo ln -s /usr/local/share/phantomjs-1.9.7-linux-x86_64/bin/phantomjs /usr/local/bin/phantomjs
$ sudo ln -s /usr/local/share/phantomjs-1.9.7-linux-x86_64/bin/phantomjs /usr/bin/phantomjs

You can retrieve the installation script on Gist: phantomjs_installer.

Service configuration

Once the binary is installed, we’ll create a script to manage the service in /etc/init.d and a configuration file in /etc/default.

You can also retrieve the init script on Gist: phantomjs init script.

/etc/init.d/phantomjs

#! /bin/sh
# Init. script for phantomjs, based on Ubuntu 12.04 skeleton.
# Author: Anthony Lapenna <lapenna.anthony@gmail.com>

PATH=/sbin:/usr/sbin:/bin:/usr/bin
DESC="Phantomjs service"
NAME=phantomjs
DAEMON=/usr/bin/$NAME
PIDFILE=/var/run/$NAME.pid
SCRIPTNAME=/etc/init.d/$NAME

# Exit if the package is not installed
[ -x "$DAEMON" ] || exit 0

# Load the VERBOSE setting and other rcS variables
. /lib/init/vars.sh

# Define LSB log_* functions.
# Depend on lsb-base (>= 3.2-14) to ensure that this file is present
# and status_of_proc is working.
. /lib/lsb/init-functions

# Overridable options section
WEBDRIVER_PORT=8190
DEBUG=false
LOG_FILE=/var/log/phantomjs.log

# Read configuration variable file if it is present
[ -r /etc/default/$NAME ] && . /etc/default/$NAME

DAEMON_ARGS="--webdriver=$WEBDRIVER_PORT --debug=$DEBUG"

#
# Function that starts the daemon/service
#
do_start()
{
 # Return
 # 0 if daemon has been started
 # 1 if daemon was already running
 # 2 if daemon could not be started
 start-stop-daemon --start --quiet --pidfile $PIDFILE --exec $DAEMON --test > /dev/null \
 || return 1
 start-stop-daemon --start --background --quiet --pidfile $PIDFILE --exec /bin/bash -- -c "$DAEMON $DAEMON_ARGS > $LOG_FILE 2>&1" \
 || return 2
 # Add code here, if necessary, that waits for the process to be ready
 # to handle requests from services started subsequently which depend
 # on this one. As a last resort, sleep for some time.
}

#
# Function that stops the daemon/service
#
do_stop()
{
 # Return
 # 0 if daemon has been stopped
 # 1 if daemon was already stopped
 # 2 if daemon could not be stopped
 # other if a failure occurred
 start-stop-daemon --stop --quiet --retry=TERM/30/KILL/5 --pidfile $PIDFILE --name $NAME
 RETVAL="$?"
 [ "$RETVAL" = 2 ] && return 2
 # Wait for children to finish too if this is a daemon that forks
 # and if the daemon is only ever run from this initscript.
 # If the above conditions are not satisfied then add some other code
 # that waits for the process to drop all resources that could be
 # needed by services started subsequently. A last resort is to
 # sleep for some time.
 start-stop-daemon --stop --quiet --oknodo --retry=0/30/KILL/5 --exec $DAEMON
 [ "$?" = 2 ] && return 2
 # Many daemons don't delete their pidfiles when they exit.
 rm -f $PIDFILE
 return "$RETVAL"
}

#
# Function that sends a SIGHUP to the daemon/service
#
do_reload() {
 #
 # If the daemon can reload its configuration without
 # restarting (for example, when it is sent a SIGHUP),
 # then implement that here.
 #
 start-stop-daemon --stop --signal 1 --quiet --pidfile $PIDFILE --name $NAME
 return 0
}

case "$1" in
 start)
 [ "$VERBOSE" != no ] && log_daemon_msg "Starting $DESC" "$NAME"
 do_start
 case "$?" in
 0|1) [ "$VERBOSE" != no ] && log_end_msg 0 ;;
 2) [ "$VERBOSE" != no ] && log_end_msg 1 ;;
 esac
 ;;
 stop)
 [ "$VERBOSE" != no ] && log_daemon_msg "Stopping $DESC" "$NAME"
 do_stop
 case "$?" in
 0|1) [ "$VERBOSE" != no ] && log_end_msg 0 ;;
 2) [ "$VERBOSE" != no ] && log_end_msg 1 ;;
 esac
 ;;
 status)
 status_of_proc "$DAEMON" "$NAME" && exit 0 || exit $?
 ;;
 #reload|force-reload)
 #
 # If do_reload() is not implemented then leave this commented out
 # and leave 'force-reload' as an alias for 'restart'.
 #
 #log_daemon_msg "Reloading $DESC" "$NAME"
 #do_reload
 #log_end_msg $?
 #;;
 restart|force-reload)
 #
 # If the "reload" option is implemented then remove the
 # 'force-reload' alias
 #
 log_daemon_msg "Restarting $DESC" "$NAME"
 do_stop
 case "$?" in
 0|1)
 do_start
 case "$?" in
 0) log_end_msg 0 ;;
 1) log_end_msg 1 ;; # Old process is still running
 *) log_end_msg 1 ;; # Failed to start
 esac
 ;;
 *)
 # Failed to stop
 log_end_msg 1
 ;;
 esac
 ;;
 *)
 echo "Usage: $SCRIPTNAME {start|stop|status|restart|force-reload}" >&2
 exit 3
 ;;
esac

:

This file needs to have execution permissions:

$ sudo chmod +x /etc/init.d/phantomjs

You can define overridable options in the following file:

/etc/default/phantomjs

WEBDRIVER_PORT=8190

If you want the service to start at boot time, type the following command:

$ update-rc.d phantomjs defaults

And here you go, you can now manage phantomjs using the service start/stop/status commands. Note that the stop command will requires a few seconds to shutdown the process.

Enjoy!

Advertisements

Disabling automatic upgrades on Ubuntu

In case some of your machines need to be updated automatically, you can disable the automatic upgrades in the following file :

/etc/apt/apt.conf.d/20auto-upgrades

Note: the naming of auto-upgrade script located in /etc/apt/apt.conf.d/ could be subjected to variations, usually the number indicating the read priority is the variable part and the file name will contain the “auto-upgrades” suffix.

Then, change all the values matching the pattern APT::Periodic::* to “0” :

APT::Periodic::Update-Package-Lists "0";
APT::Periodic::Unattended-Upgrade "0";

The changes will take effect immediatly.

VMWare vFabric tc Server installation on Ubuntu

Here is a post about the installation and configuration of the VMWare vFabric custom Tomcat server (tc server) on Ubuntu.

DOWNLOAD

First, you’ll need to get one of the following package on the VMWare website :

VMWare vFabric tc Server – Normal Edition

VMWare vFabric tc Server – Developer Edition

You will have to register an account on the VMWare website in order to download any of these packages.

The developer edition of the tc server comes along with the Spring Insight application, which allows you to monitor applications hosted on your tc server.

For more information about Spring Insight : Spring Insight Developer

INSTALLATION

Once the download finished, you need to extract the archive:

tar xvf tc-server-archive.tar.gz

Optional: after the archive has been extracted, you can put the extracted folder wherever you want:

sudo mkdir -p /opt/vmware/; sudo mv tc-server-folder $_

CONFIGURATION

Now, let’s create a vmware group and a tcserver user.

This command line will create the vmware group:

sudo groupadd vmware

These two lines will create the tcserver user with no home directory created and no possibility to login with on the system and assign him to the vmware group:

sudo useradd tcserver -M -s /bin/false
sudo adduser tcserver vmware

Next step, we’ll need to create the tc-server folder.

sudo mkdir /usr/local/tc-server
sudo chown tcserver:vmware /usr/local/tc-server

INSTANCE DEPLOYMENT

Now that our system is configured and ready, we can deploy a tc-server.

These lines will deploy a new tc-server instance called tc-inst-01 inside the folder /usr/local/tc-server using the template “insight”.

sudo /opt/vmware/tc-server-folder/tcruntime-instance.sh create -i /usr/local/tc-server -t insight --interactive tc-inst-01

Now that the instance is deployed, you can start it via :

sudo /usr/local/tc-server/tc-inst-01/bin/tcruntime-ctl start

Copy a WAR file inside the /usr/local/tc-server/tc-inst-01/webapps folder to deploy a web application.

Port forwarding using SSH

This trick allows to forward a service which can be accessed only inside a specific network to your machine (localhost).

Let’s suppose you have a specific server 192.168.1.7 which can be accessed only from the following machine 88.190.247.12 or another machine inside the 88.190.247.0 network.

Then, you type :

ssh -L3309:192.168.1.7:3306 user@88.190.247.12

And you can now access your service from localhost:3309 !

Note: If you leave the SSH connection, the port forwarding will be lost.