Teraz jest 23 lis 2024 23:31:51




Utwórz nowy wątek Odpowiedz w wątku  [ Posty: 11 ] 
Aktualizacja calibre przez crona 
Autor Wiadomość
Użytkownik
Avatar użytkownika

Dołączył(a): 13 lut 2011 0:26:45
Posty: 259
Lokalizacja: Kraków
eCzytnik: Onyx Boox X60
Post Aktualizacja calibre przez crona
Kwestia w zasadzie dotyczy chyba linuksa i pythona jako takiego, ale, że to do calibre, to pytam tutaj.
Stworzyłem sobie prosty skrypt w bashu do aktualizacji calibre (wedle przepisu na stronie calibre)
Kod:
#!/bin/bash
/usr/bin/python -c "import sys; py3 = sys.version_info[0] > 2; u = __import__('urllib.request' if py3 else 'urllib', fromlist=1); exec(u.urlopen('http://status.calibre-ebook.com/linux_installer').read()); main(install_dir='/opt')"


Wrzuciłem plik sh do /usr/bin, dodałem +x i przy uruchomieniu z konsoli ładnie działa, calibre się pobiera, a następnie instaluje.
Kiedy próbowałem dorzucić do crona zadanie by automatycznie w piątki mi aktualizował napotkałem dziwny problem.
Zadanie (dla roota) jest zdefiniowane następująco
Kod:
0 22 * * 5 /usr/bin/calibre_update.sh


Na potrzeby testów zmieniłem czas wywołania na */8 i mam poniższe efekty:
w logach:
Kod:
Feb 11 16:48:01 localhost CROND[6369]: (root) CMD (/usr/bin/calibre_update.sh)

Oznaca to, że zadanie zostało poprawnie zdefiniowane i odpalone. Jednak calibre nie zostało zaktualizowane, a na maila przyszła wiadomość:
Kod:
Traceback (most recent call last):
File "<string>", line 1, in <module>
File "<string>", line 270, in main
File "<string>", line 182, in prints
TypeError: encode() argument 1 must be string, not None


Próbowałem znaleźć problem i zauważyłem, że ten sam komunikat dosataję kiedy ubiję program zanim ściągnie paczkę z najnowszą wersją. Doszedłem do wniosku, że cron ubija mój skrypt zanim w pełni się wykona. Dorzuciłem na końcu zadania w cronie znaczek et (&) aby skrypt uruchomił się jako wydzielony proces i nie był zamknięty przez crona. Niestety nic to nie dało. Informacji o zadaniu w ogóle na maila nie otrzymałem (co nie dziwi, wszak zrobiłem fork, więc cron go nie kontrolował), ale nie było żadnego ruchu sieci (specjalnie wszystko powyłączałem i patrzyłem w iptraf).

Mam zatem pytanie do kogoś kto się zna na pythone, czy trzeba czegoś szczególnego żeby ten calibrowy skrypt instalacyjny zmusić do działania?


13 lut 2012 0:19:12
Zobacz profil WWW
Admin

Dołączył(a): 13 cze 2008 14:47:02
Posty: 2836
Lokalizacja: Gdańsk
eCzytnik: kindle
Post Re: Aktualizacja calibre przez crona
Nieco oftopicznie zapytam, ale co to za dystrybucja i dlaczego nie chcesz, żeby zajmował się tym manager pakietów?

_________________
Zgred - Rafał Ziemkiewicz napisał(a):
Dziś trzeba pisać o mieczach, czarach, toporach i wojowniczkach w blaszanych bikini, wszystko inne to już jest nisza w niszy. Albo o nastoletnich wampirach.
Porównywarka cen ebooków


13 lut 2012 12:23:38
Zobacz profil WWW
Użytkownik
Avatar użytkownika

Dołączył(a): 13 lut 2011 0:26:45
Posty: 259
Lokalizacja: Kraków
eCzytnik: Onyx Boox X60
Post Re: Aktualizacja calibre przez crona
Dystrybucja to Mandriva 2010.2. Dla mojej wersji paczka calibre ma numerek 0.6.48. Dla najnowszego wydania 0.8.13. Generalnie paczki są przygotowywane rzadziej niż raz na tydzień, a po drugie w nie lubię automatycznych aktualizacji (najnowsze wydanie hplip rozwaliło mi drukowanie w trybie draft na mojej drukarce).

Próbowałem dodać do skryptu
Kod:
wait{$}
ale nie to nie dało.


13 lut 2012 20:21:58
Zobacz profil WWW
Użytkownik

Dołączył(a): 16 lip 2011 14:21:10
Posty: 133
eCzytnik: Kindle 3
Post Re: Aktualizacja calibre przez crona
Przy założeniu, że wyłączasz regularnie komputer (ja zazwyczaj usypiam/hibernuję), dodaj do skryptu sprawdzanie dnia tygodnia i ustaw żeby się uruchamiał wraz ze startem systemy, ale nie przez crona, tylko 'normalnie', przez autostart.


13 lut 2012 20:25:10
Zobacz profil
Użytkownik

Dołączył(a): 12 lut 2012 12:10:26
Posty: 4
eCzytnik: Onyx Boox 60S
Post Re: Aktualizacja calibre przez crona
Twoje problemy wynikają najpewniej z faktu, iż z poziomu crona przy odpaleniu skryptu zmienne środowiskowe są inaczej ustawiane niż przy odpalaniu tegoż samego bezpośrednio z powłoki. Może jakieś ścieżki do includowania są wówczas niepoustawiane i stąd błąd.


14 lut 2012 20:43:53
Zobacz profil
Użytkownik
Avatar użytkownika

Dołączył(a): 13 lut 2011 0:26:45
Posty: 259
Lokalizacja: Kraków
eCzytnik: Onyx Boox X60
Post Re: Aktualizacja calibre przez crona
Spróbowałem i niewiele to pomogło, poustawiłem większość rzeczy ze zmiennych konta roota, PATH, PYTHONPATH, SHLVL i parę innych.

Zacząłem także eksperymentować z kodem samego pythona odpalanego z crona. Przepisałem najpierw skrypt do pythona
Kod:
#!/usr/bin/env python

import sys
import urllib
code = (urllib.urlopen('http://status.calibre-ebook.com/linux_installer').read())
exec(code)
main(install_dir='/opt')


Do momentu pobrania kodu wszystko się ładnie wykonuje. Zrzciłem sobie to do pliku i kod jest pobierany i jest wykonywany. Zacząłem więc testować ten kod. Wydzieliłem go sobie do pliku i odpaliłem. Kompilacja przebiegła pomyślnie. Dodałem do niego wywołanie main jak powyżej i wówczas w konsoli dostałem błąd taki, jak w cronie.

Okazuje się, że problem pojawia się w funkcji wyświetlającej dane na ekranie
Kod:
def prints(*args, **kwargs):
    f = kwargs.get('file', sys.stdout.buffer if py3 else sys.stdout)
    end = kwargs.get('end', b'\n')
    enc = getattr(f, 'encoding', 'utf-8')
    if isinstance(end, unicode):
        end = end.encode(enc)
    for x in args:
        if isinstance(x, unicode):
            x = x.encode(enc)
        f.write(x)
        f.write(b' ')
    f.write(end)
    if py3 and f is sys.stdout.buffer:
        f.flush()

Przy normalnym wywołaniu stdout jest terminalem i wszystko jest pięknie. Kiedy ustaliłem standardowe wyjście na plik poprzez
Kod:
sys.stdout = open("/home/zefiryn/out.txt","w")

linia
Kod:
x = x.encode(enc)

Pokazała błąd, enc była ustawiona na NONE. Wygląda na to, że
Kod:
enc = getattr(f, 'encoding', 'utf-8')
nie działa prawidłowo kiedy wyjściem jest plik. Wnioskuję stąd, że kiedy na sztywno ustawiłem enc na utf8 wszystko poszło gładko, informacje zamiast na ekran zapisywały się do pliku i widziałem ruch na łączach.

Ponieważ ten skrypt jest pobierany z serwera nie jestem w stanie tego zmienić w locie. Zastanawiam się, czy mogę jakoś wymusić na nim by ta linijka działała jeżeli wyjściem jest plik. Jest jakaś zmienna, która dla stdout potrafi ustawić encoding.
Przy ustawieniu stdout jak powyżej dostaję następujące wyniki:
Kod:
f = kwargs.get('file', sys.stdout.buffer if py3 else sys.stdout) > <open file u'/home/zefiryn/out.txt', mode 'w' at 0xb7516f98>
enc = getattr(f, 'encoding', 'utf-8') > None


Wydaje mi się, że w ten sposób nie da się pobrać kodowania dla wyjścia. Czy jest ktoś, kto zna pythona na tyle, by pomóc mi tak ustawić wyjście by getattr działał lub tak ustawić poprawnie jego kodowanie?


15 lut 2012 1:25:35
Zobacz profil WWW
Użytkownik
Avatar użytkownika

Dołączył(a): 13 lut 2011 0:26:45
Posty: 259
Lokalizacja: Kraków
eCzytnik: Onyx Boox X60
Post Re: Aktualizacja calibre przez crona
Udało mi się znaleźć rozwiązanie. Stworzyłem własną fukncję getattr. Kod odpalany przez crona wygląda teraz tak:

Kod:
#!/usr/bin/env python

import sys
import urllib
code = (urllib.urlopen('http://status.calibre-ebook.com/linux_installer').read())
sys.stdout = open("/root/out.txt","w")

def getattr(obj, attr, defVal):
  try:
    return obj.__dict__[attr]
  except:
    return defVal

exec(code)
main(install_dir='/opt')


15 lut 2012 1:47:53
Zobacz profil WWW
Użytkownik

Dołączył(a): 16 lip 2011 14:21:10
Posty: 133
eCzytnik: Kindle 3
Post Re: Aktualizacja calibre przez crona
Przy przekierowaniu wyjścia na /dev/null skrypt z pierwszego postu wydaje się działać, w logu nie dojrzałem się błędów, ale poczekam do piątku z ostatecznym werdyktem.


15 lut 2012 23:26:17
Zobacz profil
Użytkownik
Avatar użytkownika

Dołączył(a): 08 cze 2011 18:10:42
Posty: 176
eCzytnik: NOOK Simple Touch™
Post Re: Aktualizacja calibre przez crona
Ja korzystam z minta i żałuję, że nie ma go w repozytoriach :(


15 lut 2012 23:52:54
Zobacz profil
Admin

Dołączył(a): 13 cze 2008 14:47:02
Posty: 2836
Lokalizacja: Gdańsk
eCzytnik: kindle
Post Re: Aktualizacja calibre przez crona
tofik napisał(a):
Ja korzystam z minta i żałuję, że nie ma go w repozytoriach :(

Dodaj sobie to PPA: https://launchpad.net/~n-muench/+archive/calibre

_________________
Zgred - Rafał Ziemkiewicz napisał(a):
Dziś trzeba pisać o mieczach, czarach, toporach i wojowniczkach w blaszanych bikini, wszystko inne to już jest nisza w niszy. Albo o nastoletnich wampirach.
Porównywarka cen ebooków


16 lut 2012 11:41:41
Zobacz profil WWW
Użytkownik
Avatar użytkownika

Dołączył(a): 13 lut 2011 0:26:45
Posty: 259
Lokalizacja: Kraków
eCzytnik: Onyx Boox X60
Post Re: Aktualizacja calibre przez crona
Mnie dzisiaj skrypt zadziałał, calibre został zaktualizowany do wersji 0.8.40


18 lut 2012 0:47:50
Zobacz profil WWW
Wyświetl posty nie starsze niż:  Sortuj wg  
Utwórz nowy wątek Odpowiedz w wątku  [ Posty: 11 ] 


Kto przegląda forum

Użytkownicy przeglądający to forum: Brak zalogowanych użytkowników i 1 gość


Nie możesz rozpoczynać nowych wątków
Nie możesz odpowiadać w wątkach
Nie możesz edytować swoich postów
Nie możesz usuwać swoich postów

Skocz do:  
cron