QR Code Business Card

noctus.net

ねぇ、今日はどこに行こうかな?

Initscript mit Tiny Tiny RSS 1.5.10

8 Kommentare

Mit der Veröffentlichung der Version 1.5.10 des webbasierten Feed-Aggregators Tiny Tiny RSS fiel mir auf, dass das sich das optional beziehbare Initscript nicht mehr zum Starten des Update-Daemons nutzen lies. Beim Ausführen des Startkommandos geschah schlichtweg gar nichts.

Erste Versuche, das betreffende PHP-Script händisch zu starten schlugen weitestgehend fehl. Das Daemon-Script fror ständig ein, nachdem ich die SSH-Verbindung trennte, mit der ich meinen Server administriere. Folgende Fehlermeldung wies mich darauf hin:

Der Aktualisierungs Daemon braucht zu lange um eine Aktualisierung durchzuführen. Dies könnte auf ein Problem wie einen Absturz oder eine Blockierung hinweisen. Bitte überprüfen Sie den Prozess des Daemons oder benachrichtigen Sie den Besitzer des Instanz.

Und tatsächlich konnte das Update durch Töten des Prozesses und Löschen der lock-Dateien zeitweise wiederbeleben. Eine dauerhafte Lösung konnte dies aber nicht sein.

Also befasste ich mich erneut mit dem Initscript, welches das Hilfsprogramm start-stop-daemon zum Starten des Update-Daemons nutzt. Nach genauer Betrachtung fiel mir auf, dass nirgends ein Wechsel zu einem unprivilegierten Nutzer stattfand, der Daemon lief daher bisher immer mit Superuser-Rechten. Dass aus dies aus Sicherheitsgründen eine schlechte Idee ist dürfte ersichtlich sein.

Jedenfalls wurde diesem Verfahren mit der neuesten Version von Tiny Tiny RSS ein Riegel vorgeschoben, der im Änderungsprotokoll nicht aufgeführt aber durchaus im Versionierungsprotokoll durch diese Änderung ersichtlich ist. Der Versuch wird nun entsprechend quittiert:

[sanity_check] Please don’t run this script as root.

Mit diesem Wissen erweiterte ich das Initscript und seine Datei für Standardeinstellungen um eine neue Variable, welcher ein Nutzername oder eine -ID zugewiesen werden kann. Der Update-Daemon wird nun mit diesem Nutzer (www-data hier) ausgeführt und verfügt nicht mehr über systemweite Rechte. Es folgen die aktualisierten Dateien.

Die Einstellungsdatei /etc/default/tt-rss

## Defaults for Tiny Tiny RSS update daemon init.d script
 
# Set DISABLED to 1 to prevent the daemon from starting.
DISABLED=0
 
# Emplacement of your Tiny Tiny RSS installation.
TTRSS_PATH="/var/www/feeds"
 
# Set FORKING to 1 to use the forking daemon (update_daemon2.php) in stead of
# the standard one.
# This option is only available for Tiny Tiny RSS 1.2.20 and over.
FORKING=1
 
# Set USER to the user/uid to run the daemon as
USER=www-data

Das Initscript /etc/init.d/tt-rss

#! /bin/sh
### BEGIN INIT INFO
# Provides:          ttrss-DOMAIN
# Required-Start:    $local_fs $remote_fs networking
# Required-Stop:     $local_fs $remote_fs
# Default-Start:     2 3 4 5
# Default-Stop:      0 1 6
# Short-Description: Tiny Tiny RSS update daemon for DOMAIN
# Description:       Update the Tiny Tiny RSS subscribed syndication feeds.
### END INIT INFO
 
# Author: Pierre-Yves Landuré 
 
# 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="Tiny Tiny RSS update daemon"
NAME=$(command basename "${0}")
DISABLED=0
FORKING=0
USER=$(id --user)
 
# Read configuration variable file if it is present
[ -r "/etc/default/${NAME}" ] && . "/etc/default/${NAME}"
 
DAEMON_SCRIPT="update.php --daemon"
 
if [ "$FORKING" != "0" ]; then
  DAEMON_SCRIPT="update_daemon2.php"
fi
 
DAEMON=/usr/bin/php
DAEMON_ARGS="${TTRSS_PATH}/${DAEMON_SCRIPT}"
DAEMON_DIR="${TTRSS_PATH}"
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.0-6) to ensure that this file is present.
. /lib/lsb/init-functions
 
if [ "$DISABLED" != "0" -a "$1" != "stop" ]; then
  log_warning_msg "Not starting $DESC - edit /etc/default/tt-rss-DOMAIN and change DISABLED to be 0.";
  exit 0;
fi
 
#
# 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 --make-pidfile --background --quiet --chdir "$DAEMON_DIR" --pidfile "$PIDFILE" --chuid "$USER" --exec "$DAEMON" --test > /dev/null \
    || return 1
 
  start-stop-daemon --start --make-pidfile --background --quiet --chdir "$DAEMON_DIR" --pidfile "$PIDFILE" --chuid "$USER" --exec "$DAEMON" -- \
    $DAEMON_ARGS \
    || 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 --make-pidfile --quiet --retry=TERM/1/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/1/KILL/5 --exec $DAEMON
  [ "$?" = 2 ] && return 2
  # Many daemons don't delete their pidfiles when they exit.
  rm -f $PIDFILE
  return "$RETVAL"
}
 
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
  ;;
  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|force-reload}" >&2
  exit 3
  ;;
esac
 
:

Geschrieben von Mathias

29. Februar 2012 um 20:14

Tags: ,

3 Trackbacks/Pingbacks

  1. Google Reader Ausstieg: Tiny Tiny RSS Reader und Feedly | + mzungu's weblog +
  2. Farewell Google Reader! Hello Tiny Tiny RSS! Den Open-Source Feedreader auf eigenem Webspace installieren! | Linux und Ich
  3. Tiny Tiny RSS init-script for multiple instances on Debian Wheezy ← BAFM

8 Kommentare zu “Initscript mit Tiny Tiny RSS 1.5.10”

RSS Feed für Kommentare dieses Artikels. TrackBack URL.

  1. Usul

    17. Mai 12 um 10:22

    Danke dafür! Wenn man sich nicht viel mit Init-Scripten rumschlägt, ist das debuggen und anpassen derselben echt nicht so einfach.

  2. Kevin

    12. Mai 13 um 11:38

    Ich nutze den ZendServer CE und dessen PHP Version bringt leider kein PCNTL mit. Daher muß ich die Variante mit FORKING=0 (also die update.php) verwenden.

    Trickreich an der Geschichte war erstens der Bug im Init Skript:
    Falsch DAEMON_SCRIPT=”update.php -daemon”
    Richtig: DAEMON_SCRIPT=”update.php —daemon”
    (Achtung das sind zwei Bindestriche nacheinander, scheinbar verändert der Blog die Ausgabe!)

    Und zweitens die Tatsache das die Skripte alle nach einem Standard LAMP Stack suchen und php hart mit /usr/bin/php aufrufen. Bei mir liegt php zwar im PATH, aber das hat nicht gereicht. Die binary, die unter /usr/local/zend/bin/php zufinden ist, musste also noch verlinkt werden “ln -s /usr/local/zend/bin/php /usr/bin/php”.

    Zu guter letzt ist die Überschrift oben verwirrend “/etc/defaults/tt-rss” – das muß /etc/default/tt-rss heissen, wie es auch im init Skript geladen wird.

  3. Fabian

    14. Mai 13 um 21:11

    Danke dafür! :)

  4. Yasar

    1. Apr 14 um 19:24

    Ich habe dein skript auf einem debian 7 server “installiert”, aber das skript startet nicht wie erwartet automatisch nach einem reboot, sondern es muss manuell mittels /etc/init.d/tt-rss start gestartet werden.

    was muss ich machen, damit es automatisch startet?

    danke,Yasar

    • Mathias

      1. Apr 14 um 23:07

      Du brauchst auf jeden Fall Symlinks in den jeweiligen Runlevel-Verzeichnissen. Dies müsstest du mit dem rcconf-Kommando erreichen können. Da das bei mir schon eine halbe Ewigkeit her ist, kann ich gerade nicht sagen, ob ich das damals noch gemacht hatte.

      Wenn es funktioniert, wäre ich für eine kurze Info dankbar. Dann nehme ich das in den Beitrag auf.

      • Yasar

        4. Apr 14 um 14:35

        Die symlinks sind vorhanden, es startet trotzdem nicht.
        ich werde in einem forum nachfragen, möglicherweise weiß dort ja jemand die lösung :)

        yasar

        • Yasar

          13. Apr 14 um 22:52

          ups :) ganz vergessen hier noch die lösung hinzuschreiben, hoffe das ist nicht so schlimm

          Das problem war, dass noch nicht alle abhängigkeiten erfüllt waren.

          ich habe in /etc/init.d/tt-rss:
          # Required-Start: $local_fs $remote_fs networking
          Durch
          # Required-Start: $local_fs $remote_fs networking lighttpd mysql nfs-common
          Ersetzt.

          http://www.ubuntu-forum.de/artikel/63447/initskript-tt-rss.html#post369426

          yasar

Hinterlasse doch einen Kommentar