posativs Blog

Wuala läuft nie 100% stabil. Das kann sicherlich jeder Nutzer bezeugen - immerhin ist Wuala eine Software im Beta-Stadium (, die dafür dennoch erstaunlich stabil läuft).

Allerdings ist ein nahezu 100% laufendes Wuala für den Serverbetrieb wichtig, denn sonst erhält man die 100 Gigabyte Speicher nicht - nur, weil sich Wuala mal wieder verabschiedet hat und man nicht die Muße hat, stündlich zu gucken, ob noch alles läuft.

alive.py - automatisches Neustarten von Wuala, falls es crasht

Ich habe seit einigen Wochen ein Python-Skript in Betrieb , dass einen nahtlosen Betrieb von Wuala erlaubt. Dabei wird das Skript mittels python alive.py user aufgerufen und wird, sobald kein weiterer Prozess von Wuala läuft, Wuala neustarten. Dabei wird Wuala als Hintergrundprozess aufgerufen oder per dtach verbunden.

Zusätzlich kann mit den Argumenten status user bzw. kill user die pid des Wualas für user ausgeben bzw. das Wuala des user killen.

Beispiel: wuala

# python alive.py wuala &
# python alive.py status wuala
4829

# python alive.py kill wuala
# python alive.py status wuala
None

# screen alive.py wuala #output after two weeks
2010.06.24-01:32:: restart
2010.07.07-11:42:: restart

Hinweise

  • Wuala muss per default in ~/wuala installiert sein, sonst muss man selbst Hand in cmd anlegen.
  • das Skript muss mit root-Rechten laufen
  • zur Vereinfachung empfehle ich screen

alive.py [ Download ]

#!/usr/bin/env python
'''
Author: posativ <info@posativ.org>
Date  : 20. July 2010
Revision: 1

This software can be redistributed and modified under the following restricitons:
1. name the author
2. no commercial use
3. publish any modification

Requirements: python>=2.4 <http://python.org/>, wuala <http://wuala.com/>, root-permissions
Optional    : dtach <http://dtach.sourceforge.net/>
'''

import re
from os import popen
from sys import argv
from time import time, localtime, strftime, sleep

cmd = 'cd ~/wuala; ./wuala > /dev/null &'
#cmd = 'cd ~/wuala; dtach -n ~/dtach ./wuala' #  if you want to use dtach

def ps(user):
    '''returns pid of wuala'''
    s = popen('ps -Fu %s | grep loader[0-9].jar | grep -v grep' % user)
    for line in s:
        m = re.match('%s +(\d+)' % user, line.strip())
        if m:
            return int(m.group(1))
    return None

def kill(user):
    '''kill -9 pid'''
    pid = ps(user)
    killseq = 'kill -9 %s' % pid
    if pid:
        popen("su %s -c '%s'" % (user, killseq))
        sleep(1)

def start(user, cmd):
    '''launch wuala using dtach'''
    popen("su %s -c '%s'" % (user, cmd))

def loop(user):
    '''main loop: checks every 60 seconds, if wuala is running. If not, it will launch wuala'''
    while True:
        if not ps(user):
            print '%s:: restart' % strftime('%Y.%m.%d-%H:%M', localtime(time()))
            start(user, cmd)
        sleep(60*1)

if __name__ == '__main__':

    if len(argv) == 2:
        loop(argv[1])
    elif len(argv) > 2:
        if argv[1] == 'status' and len(argv) == 3:
            print ps(argv[2])
        elif argv[1] == 'kill' and len(argv) == 3:
            kill(argv[2])
    else: print 'usage: %s user' % argv[0]

written by posativ

by-nc-sa