Parsoid Upstart

From mediawiki.org

parsoid service in /etc/init.d[edit]

#!/bin/sh
### BEGIN INIT INFO
# Provides:          parsoid
# Required-Start:    $local_fs $network $remote_fs $syslog
# Required-Stop:     $local_fs $network $remote_fs $syslog
# Default-Start:     2 3 4 5
# Default-Stop:      0 1 6
# Short-Description: Web service converting HTML+RDFa to MediaWiki wikitext and back
# Description:       Bidirectional conversion between HTML+RDFa and the
#					 MediaWiki flavor of wikitext in a node.js web service.
#					 See https://www.mediawiki.org/wiki/Parsoid.
### END INIT INFO

# Author: Gabriel Wicke <gwicke@wikimedia.org>

# Do NOT "set -e"

# PATH should only include /usr/* if it runs after the mountnfs.sh script
PATH=/sbin:/usr/sbin:/bin:/usr/bin
DESC="Parsoid HTTP service"
NAME=parsoid
SCRIPT_PATH=/opt/web/mediawiki/parsoid/bin/server.js
DAEMON="/usr/bin/nodejs $SCRIPT_PATH"
DAEMON_ARGS=""
PIDFILE=/var/run/$NAME.pid
SCRIPTNAME=/etc/init.d/$NAME

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

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

# export the port and host env vars, if set
export PORT
export INTERFACE

# 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

#
# Function that starts the daemon/service
#
do_start()
{
	# up the number of fds [sockets] from 1024
	ulimit -n 64000

	# Return
	#   0 if daemon has been started
	#   1 if daemon was already running
	#   2 if daemon could not be started

	# calling /bin/sh is a hack needed to get output redirection on Ubuntu
	# 12.04 LTS, see below
	start-stop-daemon --start --quiet --pidfile $PIDFILE -bm \
		-c parsoid:parsoid --test \
		--exec /bin/sh -- \
		-c "$DAEMON $DAEMON_ARGS >> /var/log/parsoid/parsoid.log 2>&1" \
		|| return 1
	start-stop-daemon --start --quiet --pidfile $PIDFILE -bm \
		-c parsoid:parsoid \
		--exec /bin/sh -- \
		-c "$DAEMON $DAEMON_ARGS >> /var/log/parsoid/parsoid.log 2>&1" \
		|| return 2
	echo "Started Parsoid server on port $PORT"

	# Cleaner version of the above, but does not work with Ubuntu 12.04
	# LTS as the --no-close parameter is not yet supported there
	#start-stop-daemon --start --quiet --pidfile $PIDFILE -bm --no-close \
	#	-c parsoid:parsoid \
	#	--exec $DAEMON -- $DAEMON_ARGS >> /var/log/parsoid/parsoid.log 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.
    sleep 5
}

#
# 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/60/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/5/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 -p "$PIDFILE" "$NAME"
	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|restart|reload|force-reload}" >&2
	echo "Usage: $SCRIPTNAME {start|stop|status|restart|force-reload}" >&2
	exit 3
	;;
esac

:

how to start service...[edit]

There are two possibilities to start the service manually and automatically.

Manually[edit]

Just type in the following code as sudo :

sudo /etc/init.d/parsoid ## Only if your service is in /etc/init.d/
sudo service parsoid status

Automatically on start[edit]

The configuration for your service should exist in /etc/init/, this is how ubuntu knows which services are there. The extension of the configuration file is .conf. We will create a parsoid.conf and symlink it to /etc/init by sudo ln -s /path/to/parsoid.conf /etc/init, this allows us to edit the configuration without sudo.

The service can be started on various events

  1. start on startup: Run the service on machine startup, this happens even before the filesystem and network is completely ready.
  2. start on runlevel [Levels]: Start the service on various linux run levels.
  3. start on stopped Service_Name: Run the serivce when the mentioned service has stopped.
  4. start on started Service_Name: Run the service when the mentioned service has started.

Managing your service[edit]

UPSTART[edit]

These commands are for the UBUNTU upstart service which is not maintained anymore it has been replaced by the init.d services DEBIAN alike.

Following are some of the commands to manage your service.

  • init-checkconf /path/to/your.conf to check if your configuration is valid or not.
  • initctl start <service> to start the service
  • initctl stop <service> to stop the service
  • initctl restart <service> to restart the service
  • initctl status <service> to see the status your service, whether its stopped, running etc.
  • initctl reload-configuration is used after you created a new configuration to reload the configurations
  • initctl list to see the list of all registered services
  • initctl list | grep <service> to see if your service is registered or not

Logs[edit]

All your service logs are stored at /var/log/upstart/service_name.log. If you see any issues in service start etc. then just go over the logs to figure out what could be the issue. This has the stdout from your service.

SYS-V ALIKE INIT SYSTEM.[edit]

The SYS-V alike init-system is the new DEBIAN way to regulate services. As mentioned the script is copied within init.d and made executable.

If you wish to add a new service to start when the machine boots you should add the necessary script to the directory /etc/init.d/. Many of the scripts already present in that directory will give you an example of the kind of things that you can do.

Here's a very simple script which is divided into two parts, code which always runs, and code which runs when called with "start" or "stop". https://debian-administration.org/article/28/Making_scripts_run_at_boot_time_with_Debian

Once you've saved your file into the correct location make sure that it's executable by running "chmod 755 /etc/init.d/blah".

Then you need to add the appropriate symbolic links to cause the script to be executed when the system goes down, or comes up.

The simplest way of doing this is to use the Debian-specific command update-rc.d:

root@skx:~# update-rc.d blah defaults
 Adding system startup for /etc/init.d/blah ...
   /etc/rc0.d/K20blah -> ../init.d/blah
   /etc/rc1.d/K20blah -> ../init.d/blah
   /etc/rc6.d/K20blah -> ../init.d/blah
   /etc/rc2.d/S20blah -> ../init.d/blah
   /etc/rc3.d/S20blah -> ../init.d/blah
   /etc/rc4.d/S20blah -> ../init.d/blah
   /etc/rc5.d/S20blah -> ../init.d/blah

If you wish to remove the script from the startup sequence in the future run:

root@skx:/etc/rc2.d# update-rc.d -f  blah remove
update-rc.d: /etc/init.d/blah exists during rc.d purge (continuing)
 Removing any system startup links for /etc/init.d/blah ...
   /etc/rc0.d/K20blah
   /etc/rc1.d/K20blah
   /etc/rc2.d/S20blah
   /etc/rc3.d/S20blah
   /etc/rc4.d/S20blah
   /etc/rc5.d/S20blah
   /etc/rc6.d/K20blah

This will leave the script itself in place, just remove the links which cause it to be executed.

You can find more details of this command by running "man update-rc.d".

The init system helpers can be found in the apt package init-system-helpers.