Pomoc Cron uruchamia tylko część skryptu. Gdzie tkwi błąd?

D

Deleted member 15017

Guest
Witam wszystkich Forumowiczów.

Od dłuższego czasu walczę ze skryptem tworzącym kopie zapasowe. Skrypt w pierwszym kroku ciągnie dane ze zdalnej lokalizacji za pomocą rsync przez ssh i tworzy kopię lustrzaną na NAS a potem kopię przyrostową za pomocą rdiff-backup tego co zostało zrsyncowane. Zdalny host to win xp na którym działa serwer ssh na który loguje się kluczem. Wszystko działa tak jak zaplanowałem (poza detekcją zdalnego hosta dlatego jest odkomentowane ale z tego mogę zrezygnować) ale tylko przy wywołaniu skryptu ręcznie czy to przez użytkownika yy czy admina - nie ma problemu z ssh. Zależy mi na uruchamianiu skryptu cronem a tu występuje problem. Sam skrypt jest uruchamiany ale wykonuje się tylko rsync. Polecenie rdiff-backup nie jest wykonywane. Skrypt wykonywany ręcznie czy przez admina czy usera działa. Z crona nie chce. Zauważyłem, że cron nie chciał uruchomić skryptu jeśli wskazałem użytkownika yy który jako jedyny może się połączyć przez ssh ze zdalnym hostem, dlatego wpis w cron nie ma zdefiniowanego użytkownika, a admin korzysta z klucza użytkownika yy.

Model TS-212p, Firmwere 4.3.3.0238, Optware 0.99.163

A to sam skrypt:

Kod:
#!/bin/bash -xv
RHOST="xx.xx.xx.xx"
OPTIONS="-azrv --verbose --stats --progress --exclude 'Pobrane' --delete"
CEL="/share/HDB_DATA/homes/yy/.archiwum"
DATE=`date +'%Y.%m.%d.%H:%M'`

#sprawdzanie dostępnosci RHOST
PING="/bin/ping"
#$PING -c 3 -t 300 $RHOST >/dev/null 2>&1
#R1=$1
#if [ $R1 -eq1 ];
#then
#echo "HOST nie jest dostepny przerywam wykonywanie kopi" > /$CEL/ERROR_$DATE.log
#exit 0
#else
#echo "OST jest dostepny robie kopie"
#fi
# prosty mechanizm lock'a by uniemożliwić wielokrotne uruchomienie
# skryptu, np. w sytuacji gdy nie zdąży wykonać się pełny backup
if [ -f "/share/HDB_DATA/homes/yy/server_sync" -o -f "/share/HDB_DATA/homes/yy/server_sync_block" ]; then
        echo "Another sync is still running!"
        exit 1
fi
touch /share/HDB_DATA/homes/yy/server_sync
#kopia lustrzna zasobow 
#SB4
rsync  $OPTIONS -e "ssh -p 1234 -l user -i /share/HDB_DATA/homes/admin/.ssh/id_rsa" $RHOST:/cygdrive/f/SB4 \
$CEL/current --log-file=/$CEL/1.log
#dane
rsync  $OPTIONS --exclude 'Pobrane' --exclude 'Pobieranie' -e "ssh -p 1234 -l user -i /share/HDB_DATA/homes/admin/.ssh/id_rsa" $RHOST:/cygdrive/f/dane \
$CEL/current --log-file=/$CEL/2.log

# sprawdzenie czy synchronizacja się udała
# jeśli się nie udała to możemy chcieć skasować niedokończony
# jeśli się nie udała to możemy chcieć skasować niedokończony
# backup by kolejny nie musiał być "prawie pełnym"
# plik /tmp/server_sync_block trzeba skasować ręcznie
if [ $? -ne 0 -a $? -ne 24 ]; then
        echo "Something was wrong becase rsync return $?"
            touch /share/HDB_DATA/homes/yy/server_sync_block
            exit 2
fi

#utworzenie kopii przyrostowej
rdiff-backup -v5  --preserve-numerical-ids --print-statistics /share/HDB_DATA/homes/yy/.archiwum/current /share/HDB_DATA/homes/yy/.archiwum/rdiff_backup


cat /$CEL/1.log  /$CEL/2.log /$CEL/rdiff_backup/rdiff-backup-data/backup.log > /$CEL/log.log

mv /$CEL/log.log  /$CEL/$DATE.log

rm  -f $CEL/?.log
rm /$CEL/rdiff_backup/rdiff-backup-data/backup.log

# zwalnianie lock'a
rm -f /share/HDB_DATA/homes/yy/server_sync

Najdziwniejsze jest to, że skrypt z palca działa, a z crona tylko w części polecenie rync działa, rdiff-backup nie, nie tworzy się kopia przyrostowa, nie pojawiają się żadne kopie przyrostowe po sprawdzeniu rdiff-backup -l. Będę wdzięczny za wszelkie sugestie. Co jest źle?
 
puść sobie w cronie "echo $PATH"
a puść sobie w shell "echo $PATH" i porównaj katalogi


upload_2017-9-23_11-52-29.png
 
  • Lubię to
Reakcje: Silas Mariusz
Dziękuję za pomoc. Działa! Pomogło podanie pełnych ścieżek. Zmyliło mnie to, że rsync jest dostarczany z systemem dlatego cron go umiał znaleźć bez podania ścieżki, tak samo jak date. Ale rdiff-backup instalowałem przez Optware i pewnie cron nie widzi ścieżek do binarek z Optware. Gdyby jeszcze ktoś zerknął na początek skryptu i pomógł poprawić wykrywanie dostępności hosta...
 
Do tego miejsca doszedłem. W moim skrypcie w przypadku błędu powinno nastąpić przerwanie ale tak się nie dzieje. Wiem że host jest dostępny a mój skrypt się nie wykonuje. Pewnie jest jakiś lamerski błąd w składni. Jeśli to nie problem to poprosiłbym o poprawienie kodu. Ten skrypt jest moim pierwszym i nie bardzo umiem skorzystać z podpowiedzi.
 
skrypt:
Bash:
[/tmp] # cat tescik.sh
#!/bin/bash
#Sprawdzanie dostpnosci RHOST
PING="/bin/ping"
$PING -c 1 8.8.8.9 >/dev/null 2>&1
if [ $? -eq 1 ];
then
echo "HOST nie jest dostepny przerywam wykonywanie kopi"
exit 0
else
echo "Host obecny"
fi

test skrytpu na błędnym hoście
Kod:
[/tmp] # ./tescik.sh
HOST nie jest dostepny przerywam wykonywanie kopi
[/tmp] #
 

Załączniki

  • upload_2017-9-23_19-35-53.png
    upload_2017-9-23_19-35-53.png
    4,5 KB · Wyświetleń: 51
  • Love
Reakcje: Silas Mariusz
Pigers - dzięki za pomoc!
Wszystko działa jak należny. Temat uważam za zakończony. Dla potomnych którzy będą czytać wątek wspomnę o dodatkowej funkcjonalności. Dodałem sobie do skryptu jeszcze jedną linijkę:
Kod:
ssh -p 1234 -l yyy -i /share/HDB_DATA/homes/admin/.ssh/id_rsa $RHOST "msg.exe * Rozpoczynam tworzenie kopii zapasowej. Proszę zapisać otwarte dokumenty i zamknąć program xyz"
sleep 60

wstawiłem to przed rozpoczęciem kopiowania przez rsync. Teraz użytkownik zdalnego serwera z którego dane kopiuję dostaje powiadomienie w postaci wyskakującego okienka o rozpoczęciu tworzenia kopi i ma możliwość zapisania dokumentów i zakończenia działania programu którego baza danych jest archiwizowana.