reminett Skrevet 12. februar 2011 Del Skrevet 12. februar 2011 Hei! Jeg har en maskin ("photobot") som tar bilde hvert 3. minutt, og kjører rsync rett etter at bildet er tatt. Dette for å synkronisere bildemappen med webserveren ("juliet"). Photobot er på nett med mobilt bredbånd som er noe ustabilt i dekningen. Det vil si at nettet går ned av og til, og det blir dermed liggende noen bilder i "bufferen" (mappen som skal synces) i ny og ne. Når rsync går i gang, kan det av og til ta litt lang tid, dersom det er mange bilder som må synces pga at det er lenge siden sist sync (les: sist det var mobildekning). Problemet er da at rsync startes på nytt igjen etter 3 minutter, selv om rsync allerede er i gang med å synkronisere. Hvordan kan jeg forhindre dette? Et alternativ er: Hvert 3. minutt: ta bilde og kjør rsync på newestphoto.png, og ikke hele bildemappa Hver time: kjør rsync på hele bildemappa Hvis jeg skal gjøre det på denne måten, er det 2 issues 1. Jeg får kun bildehistorikk hver time, men det kan jeg vel leve med 2. Dersom forrige rsync-jobb av en eller annen grunn skal ha krasjet, vil jeg drepe prosessen før jeg syncer igjen. Men jobbene som kjøres hvert 3. minutt skal drepe forrige 3-minuttsjobb, og de som kjøres hver time skal drepe forrige timesjobb. Derfor vil jo "killall rsync" før synkingen kjøres hvert trede minutt, drepe en eventuell timessync. Kan jeg "navngi" prosesser? Er alternativet mitt en god løsning? Eller finnes det en bedre måte, hvor jeg kan ivareta sync hvert 3. minutt samtidig som jeg får syncet hele historikken? Beklager langt innlegg, men det var ikke så lett å forklare hva jeg mener her Lenke til kommentar
sablabra Skrevet 12. februar 2011 Del Skrevet 12. februar 2011 Å forhindre at rsync starter når det allerede er en rsync-prosess kjørende burde være temmelig greit å ordne med et lite script. Kommandoen 'lsof /usr/bin/rsync' (gitt at rsync ligger i den mappen) avslører om rsync allerede kjører, og da skulle det bare være å bruke en if-statement som kun starter ny synkronisering dersom rsync ikke kjører allerede. Så får du en liten øvelse i bash scripting også Resten av posten din forsto jeg ikke helt men... Lenke til kommentar
reminett Skrevet 12. februar 2011 Forfatter Del Skrevet 12. februar 2011 Å forhindre at rsync starter når det allerede er en rsync-prosess kjørende burde være temmelig greit å ordne med et lite script. Kommandoen 'lsof /usr/bin/rsync' (gitt at rsync ligger i den mappen) avslører om rsync allerede kjører, og da skulle det bare være å bruke en if-statement som kun starter ny synkronisering dersom rsync ikke kjører allerede. Så får du en liten øvelse i bash scripting også Resten av posten din forsto jeg ikke helt men... Takk for svar. Nei, jeg skjønner nesten ikke posten selv Løsningen din er enkel og brilliant. Men hva hvis rsync-prosessen ikke har svart den siste timen? Hvordan lager jeg et bash script som gjør dette: if rsync kjører if rsync har kjørt mer enn 1 time kill rsync kjør rsync Takk for hjelpen Lenke til kommentar
Sokkalf™ Skrevet 12. februar 2011 Del Skrevet 12. februar 2011 Lag en lock-fil. F.eks touch /tmp/rsync.lock Så sjekker du i scriptet ditt om den eksisterer, og gjør en exit hvis den finnes, kjører rsync som vanlig hvis ikke. Husk å legge til at scriptet sletter lock-fila når rsyncjobben er ferdig. Lenke til kommentar
reminett Skrevet 13. februar 2011 Forfatter Del Skrevet 13. februar 2011 Enkel og brilliant igjen Jeg ser ingen umiddelbare problemer med å gjøre det på den måten, så kanskje jeg burde gå for det.. Hvordan kan jeg sjekke om lock filen har eksistert "for lenge"? Dvs dersom rsync har hold på i 60 min, vil jeg starte på nytt.. Lenke til kommentar
sablabra Skrevet 14. februar 2011 Del Skrevet 14. februar 2011 (endret) Første tanken jeg fikk var å sjekke når filen sist ble endret og dersom det er lenger enn 60 min siden kan den drepe rsync, slette lock-filen og starte på nytt. For å finne når filen sist ble forandret: 'date +%s /sti/til/filen.lock' og tiden nå: 'date +%s'. Så skulle det bare være å lage en if-statement som dreper rsync og starter på nytt dersom "sist_forandret-tiden_nå > 3600". Håper det var forståelig EDIT: DevilsDecoy var kjip og fjernet utfordringen for trådstarter Endret 14. februar 2011 av sablabra Lenke til kommentar
DevilsDecoy Skrevet 14. februar 2011 Del Skrevet 14. februar 2011 Tror dette skal funke: PIDFILE=/tmp/rsync.pid if [ -f $PIDFILE ]; then if [ $((`date +%s`-`stat --format=%Y $PIDFILE`)) -gt 3600 ]; then # Har kjørt for lenge, drep og start på nytt kill `cat $PIDFILE`; sleep 5; kill -9 `cat $PIDFILE`; rm $PIDFILE; else # Rsync kjører, men har ikke kjørt mer en 60 min exit; fi fi #Start ny rsync echo -n $$ > $PIDFILE rsync [...] rm /tmp/rsync.pid Lenke til kommentar
reminett Skrevet 14. februar 2011 Forfatter Del Skrevet 14. februar 2011 Tusen takk, DevilsDecoy! Dette skal testes straks jeg har maskinen oppe igjen Lenke til kommentar
AlecTBM Skrevet 14. februar 2011 Del Skrevet 14. februar 2011 En PID fil skal jo strengt tatt inneholde PID til prosessen som kjøres. Er jo lett å hente ut hvor lenge den prosessen har gått ved hjelp av ps, og om den fremdeles går med kill -0 Lenke til kommentar
reminett Skrevet 25. februar 2011 Forfatter Del Skrevet 25. februar 2011 Her kommer en oppdatering: DevilsDecoys løsning fungerer perfekt, "rett ut av boksen" Lenke til kommentar
Anbefalte innlegg
Opprett en konto eller logg inn for å kommentere
Du må være et medlem for å kunne skrive en kommentar
Opprett konto
Det er enkelt å melde seg inn for å starte en ny konto!
Start en kontoLogg inn
Har du allerede en konto? Logg inn her.
Logg inn nå