To create new wiki account, please join us on #znc at Libera.Chat and ask admins to create a wiki account for you. You can say thanks to spambots for this inconvenience.
Running ZNC as a system daemon: Difference between revisions
Jump to navigation
Jump to search
>JayAdams0x1 m Put sudo on each execution line so it's apparent that you need to be root. |
>JayAdams0x1 Added back the Debian init.d script along with the Fedora version. |
||
Line 7: | Line 7: | ||
* Make the configuration we will run at startup: | * Make the configuration we will run at startup: | ||
sudo -u znc /usr/bin/znc --datadir=/var/lib/znc --makeconf | sudo -u znc /usr/bin/znc --datadir=/var/lib/znc --makeconf | ||
* | * Here is the <code>/etc/init.d/znc</code> for Fedora-based machines: | ||
#!/bin/sh | #!/bin/sh | ||
# | # | ||
Line 97: | Line 96: | ||
esac | esac | ||
exit $? | exit $? | ||
* Here is the <code>/etc/init.d/znc</code> for Debian-based machines: | |||
#! /bin/sh | |||
### BEGIN INIT INFO | |||
# Provides: znc | |||
# Required-Start: $remote_fs $syslog | |||
# Required-Stop: $remote_fs $syslog | |||
# Default-Start: 2 3 4 5 | |||
# Default-Stop: 0 1 6 | |||
# Short-Description: ZNC IRC bouncer | |||
# Description: ZNC is an IRC bouncer | |||
### END INIT INFO | |||
PATH=/sbin:/usr/sbin:/bin:/usr/bin | |||
DESC="ZNC daemon" | |||
NAME=znc | |||
DAEMON=/usr/bin/$NAME | |||
DATADIR=/var/lib/znc | |||
DAEMON_ARGS="--datadir=$DATADIR" | |||
PIDDIR=/var/run/znc | |||
PIDFILE=$PIDDIR/$NAME.pid | |||
SCRIPTNAME=/etc/init.d/$NAME | |||
USER=znc | |||
GROUP=znc | |||
# Exit if the package is not installed | |||
[ -x "$DAEMON" ] || exit 0 | |||
# Read configuration variable file if it is present | |||
[ -r /etc/default/$NAME ] && . /etc/default/$NAME | |||
# 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() | |||
{ | |||
# Return | |||
# 0 if daemon has been started | |||
# 1 if daemon was already running | |||
# 2 if daemon could not be started | |||
if [ ! -d $PIDDIR ] | |||
then | |||
mkdir $PIDDIR | |||
fi | |||
chown $USER:$GROUP $PIDDIR | |||
start-stop-daemon --start --quiet --pidfile $PIDFILE --exec $DAEMON --test --chuid $USER > /dev/null || return 1 | |||
start-stop-daemon --start --quiet --pidfile $PIDFILE --exec $DAEMON --chuid $USER -- $DAEMON_ARGS > /dev/null || return 2 | |||
} | |||
# | |||
# 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 --chuid $USER | |||
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 --chuid $USER | |||
[ "$?" = 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() { | |||
start-stop-daemon --stop --signal 1 --quiet --pidfile $PIDFILE --name $NAME --chuid $USER | |||
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 "$DAEMON" "$NAME" && exit 0 || exit $? | |||
;; | |||
reload) | |||
log_daemon_msg "Reloading $DESC" "$NAME" | |||
do_reload | |||
log_end_msg $? | |||
;; | |||
restart) | |||
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 {status|start|stop|reload|restart}" >&2 | |||
exit 3 | |||
;; | |||
esac | |||
# Give the right permissions to this file: | # Give the right permissions to this file: |
Revision as of 21:13, 2 July 2014
Note: if you just want to run ZNC automatically, when server is turned on, look here instead.
To have ZNC run at boot time as a system daemon we will create a user and group to run ZNC from a configuration we created and then called at each time the system boots. All the commands are expected to run as an administrator.
- Create a new system user with accompanying group and a shell that cannot be used to login with:
sudo adduser --system --shell /sbin/nologin --comment "Account to run ZNC daemon" --user-group znc
- Make the configuration we will run at startup:
sudo -u znc /usr/bin/znc --datadir=/var/lib/znc --makeconf
- Here is the
/etc/init.d/znc
for Fedora-based machines:
#!/bin/sh # # znc - Advanced IRC Bouncer INIT script # # description: An Advanced IRC bouncer INIT script for # Source function library. . /etc/rc.d/init.d/functions exec=/usr/bin/znc prog=znc config=/var/lib/znc runas=znc lockfile=/var/lock/subsys/$prog start() { [ -x $exec ] || exit 5 echo -n $"Starting $prog: " # if not running, start it up here, usually something like "daemon $exec" daemon --user $runas "$exec -d $config >/dev/null 2>&1" # If you're reckless with your system, comment the line above and # uncomment this one below... I just don't get it why # daemon "$exec -r -d $config >/dev/null 2>&1" retval=$? echo [ $retval -eq 0 ] && touch $lockfile return $retval } stop() { echo -n $"Stopping $prog: " # stop it here, often "killproc $prog" killproc $prog -TERM retval=$? echo [ $retval -eq 0 ] && rm -f $lockfile return $retval } reload() { echo -n $"Reloading $prog: " # stop it here, often "killproc $prog" killproc $prog -HUP retval=$? echo } restart() { stop start } rh_status() { # run checks to determine if the service is running or use generic status status $prog } rh_status_q() { rh_status >/dev/null 2>&1 } case "$1" in start) rh_status_q && exit 0 $1 ;; stop) rh_status_q || exit 0 $1 ;; restart) $1 ;; reload) rh_status_q || exit 7 $1 ;; status) rh_status ;; condrestart|try-restart) rh_status_q || exit 0 restart ;; *) echo $"Usage: $0 {start|stop|status|reload|restart|condrestart|try-restart}" exit 2 esac exit $?
- Here is the
/etc/init.d/znc
for Debian-based machines:
#! /bin/sh ### BEGIN INIT INFO # Provides: znc # Required-Start: $remote_fs $syslog # Required-Stop: $remote_fs $syslog # Default-Start: 2 3 4 5 # Default-Stop: 0 1 6 # Short-Description: ZNC IRC bouncer # Description: ZNC is an IRC bouncer ### END INIT INFO PATH=/sbin:/usr/sbin:/bin:/usr/bin DESC="ZNC daemon" NAME=znc DAEMON=/usr/bin/$NAME DATADIR=/var/lib/znc DAEMON_ARGS="--datadir=$DATADIR" PIDDIR=/var/run/znc PIDFILE=$PIDDIR/$NAME.pid SCRIPTNAME=/etc/init.d/$NAME USER=znc GROUP=znc # Exit if the package is not installed [ -x "$DAEMON" ] || exit 0 # Read configuration variable file if it is present [ -r /etc/default/$NAME ] && . /etc/default/$NAME # 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() { # Return # 0 if daemon has been started # 1 if daemon was already running # 2 if daemon could not be started if [ ! -d $PIDDIR ] then mkdir $PIDDIR fi chown $USER:$GROUP $PIDDIR start-stop-daemon --start --quiet --pidfile $PIDFILE --exec $DAEMON --test --chuid $USER > /dev/null || return 1 start-stop-daemon --start --quiet --pidfile $PIDFILE --exec $DAEMON --chuid $USER -- $DAEMON_ARGS > /dev/null || return 2 } # # 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 --chuid $USER 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 --chuid $USER [ "$?" = 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() { start-stop-daemon --stop --signal 1 --quiet --pidfile $PIDFILE --name $NAME --chuid $USER 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 "$DAEMON" "$NAME" && exit 0 || exit $? ;; reload) log_daemon_msg "Reloading $DESC" "$NAME" do_reload log_end_msg $? ;; restart) 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 {status|start|stop|reload|restart}" >&2 exit 3 ;; esac
- Give the right permissions to this file:
sudo chmod 755 /etc/init.d/znc
- Execute:
sudo update-rc.d znc defaults
Now that all the pieces are in place you can now start the service yourself or restart the computer for the daemon to take its place.
- Start the service:
sudo service znc start
- Verify that the service is running:
sudo service znc status