Skryp bash, czy to jest poprawnie?

Potrzebujesz pomocy z C, C++, perl, python, itp.
cooleq
Beginner
Posty: 172
Rejestracja: 18 czerwca 2010, 13:47
Lokalizacja: Wrocław

Skryp bash, czy to jest poprawnie?

Post autor: cooleq »

Witam,
napisałem skrypt do automatycznej archiwizacji pewnego folderu na płytach i chciałbym go wrzucić w crona do tygodniowego wykonania. Jako, że skryptów jako takich jeszcze nie pisałem prosiłbym o zerknięcie i wytknięcie mi błędów, coby w przyszłości było porządnie.

Kod: Zaznacz cały

#!/bin/sh
if 
    test -e /home/backup/projekty_temp 
    then 
        echo "Katalog istnieje, kontynuowanie spowoduje wyczyszczenie katalogu. Przerwać?: y or n"
        read decyzja
        if 
            decyzja = 'y' 
            then
                echo "Przerywam skrypt."
                exit
        fi
        echo "Czyszczę katalog."
        rm -R /home/backup/projekty_temp/*
        mkdir /home/backup/projekty_temp/projekty
    else 
        echo "Tworzę katalog."
        mkdir /home/backup/projekty_temp/
        mkdir /home/backup/projekty_temp/projekty

fi
rsync -rv /home/tomasz/Projekty /home/backup/projekty_temp/projekty --progress
tar -cvzf /dev/stdout /home/backup/projekty_temp/projekty | split -d -b 4600m - /home/backup/projekty_temp/file.tgz.
rm -R /home/backup/projekty_temp/projekty
ile=`ls /home/backup/projekty_temp | wc -l`
i=0
for ((i=0;i<$ile;i++))
do
    echo $i
#    mkisofs -J -r -v -V nagrania -o /home/backup/projekty_tmp/nagrania.iso /home/backup/projekty_tmp/file.tgz.0$i
#    cdrecord -v -eject dev=/dev/scd0 /home/nagrania.iso
#    rm /home/tomasz/nagrania.iso
#    i=$(($i+1))
done
Szczerze nie uruchamiałem go w całości, tylko fragmentami bo wiem, że ma jeszcze co najmniej dwa błędy. Pierwszy opisałem http://debian.linux.pl/threads/19149-ta ... post134428 a drugi to taki że nagrywarka nie czeka aż ktoś jej wsunie płytę tylko od razu sprawdza że nie ma odpowiedniej i jedzie dalej. Dobrze by było gdyby jednak czekała, bo nikt nie będzie stał nad serwerem i czekał na wysunięcie klapki...
pioruns
Beginner
Posty: 117
Rejestracja: 12 stycznia 2008, 17:36

Post autor: pioruns »

Automatyczny, cotygodniowy skrypt do archiwizacji nie powinien być interaktywny. Powinieneś przewidzieć, jakie możliwości mogą się pojawić i przerwać/kontynuować pracę, ew. zrobić coś innego w przypadku wykrycia istniejącego katalogu. W przypadku braku płyty w nagrywarce, możesz zapętlić skrypt w oczekiwaniu, aż taka płyta się pojawi.
cooleq
Beginner
Posty: 172
Rejestracja: 18 czerwca 2010, 13:47
Lokalizacja: Wrocław

Post autor: cooleq »

Rzeczywiście pytanie użytkownika o cokolwiek nie ma sensu w przypadku automatu.
Jednak dalej nie wiem jak zrobić żeby czekał na płytkę. Nie ma problemu żeby stworzyć nieskończoną pętlę ale nie wiem jak sprawdzać że ma płytkę odpowiednią do zapisu na dodatek.
Tu mam taką opcje ale szczerze mówiąc nie do końca rozumiem.

Kod: Zaznacz cały

       -checkdrive
              Checks if a driver for the current drive is present and exit.  If the drive is a known drive, wodim uses exit code 0.
Jak wykonuję to polecenie niestety nie dostaję zwrotnego '0' które mógłbym wykorzystać, w związku z czym dalej nie wiem jak rozwiązać ten problem.
pioruns
Beginner
Posty: 117
Rejestracja: 12 stycznia 2008, 17:36

Post autor: pioruns »

-checkdrive to nie będzie to.
A co się dzieje, gdy wywołasz

Kod: Zaznacz cały

cdrecord -v -eject dev=/dev/scd0 /home/nagrania.iso
a w napędzie nie będzie płyty? Program zakończy natychmiast działanie i zapewne zwróci kod błędu? Dodaj do swojego skryptu odczytanie kodu zwracanego przez to polecenie, wtedy będziesz wiedział, czy płyta nagrała się z powodzeniem czy nie (a więc dowiesz się, czy nośnik był i czy był zapisywalny). Wtedy będziesz mógł zakończyć skrypt, zapętlić go w oczekiwaniu na powodzenie nagrania płyty lub też zgłosić błąd i przerwać działanie skryptu.
cooleq
Beginner
Posty: 172
Rejestracja: 18 czerwca 2010, 13:47
Lokalizacja: Wrocław

Post autor: cooleq »

Nie bardzo wiem jak pobrać błąd żeby mieć to jak sprawdzić. To co zwraca program

Kod: Zaznacz cały

cdrecord -eject dev=/dev/scd0 /home/nagrania.iso
wodim: No write mode specified.
wodim: Asuming -tao mode.
wodim: Future versions of wodim may have different drive dependent defaults.
Device type    : Removable CD-ROM
Version        : 5
Response Format: 2
Capabilities   :
Vendor_info    : 'TSSTcorp'
Identification : 'CDDVDW SH-S223L '
Revision       : 'SB02'
Device seems to be: Generic mmc2 DVD-R/DVD-RW.
Using generic SCSI-3/mmc   CD-R/CD-RW driver (mmc_cdr).
Driver flags   : MMC-3 SWABAUDIO BURNFREE
Supported modes: TAO PACKET SAO SAO/R96P SAO/R96R RAW/R16 RAW/R96P RAW/R96R
Errno: 5 (Input/output error), test unit ready scsi sendcmd: no error
CDB:  00 00 00 00 00 00
status: 0x2 (CHECK CONDITION)
Sense Bytes: 70 00 02 00 00 00 00 0A 00 00 00 00 3A 01 00 00
Sense Key: 0x2 Not Ready, Segment 0
Sense Code: 0x3A Qual 0x01 (medium not present - tray closed) Fru 0x0
Sense flags: Blk 0 (not valid)
cmd finished after 0.172s timeout 40s
wodim: No disk / Wrong disk!
nie bardzo wiem jak tu pobrać jakąś zmienną żeby można było wstawić jako wartość do testowania.

edit:
Znalazłem inną metodę, wg mnie powinna dobrze działać ale coś chyba źle skonstruowałem.

Kod: Zaznacz cały

#! /bin/bash
#test

DISC_STAT=`dvd+rw-mediainfo /dev/scd0 | awk '/Disc status:/ {print $3}'`
echo $DISC_STAT
until ["$DISC_STAT" == "blank"] 
do
    
    DISC_STAT=`dvd+rw-mediainfo /dev/scd0 | awk '/Disc status:/ {print $3}'`
    sleep 5s
    eject
done
z tym że jak wywołam ten program to w pętli dostaję
/home/tomasz/skrypty/test.sh: line 6: [blank: command not found
problem jest jeszcze w tym, że jak odkomentuję 'eject' to w pętli dostaję
:-( no media mounted, exiting...
nawet jak wsunę płytę to dalej jest ten komunikat, a chyba powinien się pojawić ten poprzedni do kolejnego wywołania eject.
Mam jeszcze takie pytanie czy da się wysłać email bez konfiguracji serwera pocztowego? Chodzi o poinformowanie mnie raz w tyg, że serwer czeka na płytę :)
ODPOWIEDZ