Miten saan skriptin pyörimään loopilla?

kirjoitin skriptin, joka kopioi automaattisesti kytkettäessä kamerasta kuvat työpöydälle, ja tekee kansiosta sitten tarballin. asetin startup programs- toiminnolla skriptin käynnistymään automaattisesti koneen käynnistyessä. ongelmana kuitenkin on se, että tämä toimii vain kerran, jonka jälkeen se pitää suorittaa manuaalisesti jos kytken kameran uudestaan saman istunnon aikana. miten koodia pitää muokata, että saan sen toimimaan täysin automaattisesti? skriptausta oon opetellut vasta alle 10 tuntia, eli mitään älyttömän monimutkaista en vielä osaa tehdä. tässä on koodi, neuvot on tervetulleita.

[code]#!/bin/bash
DATE=$(date +"%d-%m-%Y")
until [ -d /media/disk/DCIM/ ]
do
sleep 1
done

if [ -d /media/disk/DCIM/ ]
then
cp -vr /media/disk/ /root/Desktop/$DATE
tar czvf /root/Desktop/$DATE.tar.gz /root/Desktop/$DATE
fi[/code]

Loopin sijaan olisi parempi laittaa koodisi suoriutumaan kun kamerasi huomataan kytketyksi. Tämä onnistuisi käyttämällä hyväksi udev:n scriptausmahdollisuuksia.

Kuitenkin ajattelin nyt mennä siitä mistä aita on matalin:

Esimerkki silmukasta, jollaista ei pitäisi koskaan tehdä, eli silmukka joka ei pääty koskaan:

Käärimällä koodisi yllä mainitun silmukan suoritusosaan saat kivasti kyllä koodisi suoriutumaan loputtomasti perätysten. Tästä tosin päästään taas reaalimaailman ongelmiin ja yhtäaikaisiin tai päällekkäisiin suorituksiin.

Sinun siis tulisi joko käyttää lukkotiedostoja tarkistamaan, ettei scripta suorita operaatiotaan enemmän kuin kerran saati samanaikaisesti vain yhtäjaksoisesti. Jälkimminen tapaus ratkeaa automaattisesti koska kyse on yhdestä suoritettavasta ohjelmasta, mutta ensimmäinen ongelma sinun pitää ratkoa.

Suosittelen siis lisääväsi scriptan luomaan tarkistustiedoston alkaessaan siirtää kuvia ja pakata kuvia ja poistaa se kun operaatio on valmis. Samalla myös sinun on hyvä lisätä tarkistus, että jos tämä kohdepakettitiedostosi on jo olemassa ei tehdä mitään, koska päällekäiset operaatiothan olisivat turhia.

Lopuksi kokonaisuutta voit parannella ilmoittamaan itsellesi sähköpostilla tai työpöydän ilmoituksilla, kun operaatio on aloitettu ja saatu valmiiksi.

Ympäripyöreää, mutta itse oivaltaminen on paras opettaja. :slight_smile:

udev? lukkotiedostot? en ymmärtänyt tosta siansaksasta sanaakaan, oisko noihin olemassa jotain ymmärrettäviä ohjeita jossain?
jotain epämääräisiä ohjeita FSTABin käytöstä ym löysin sieltä sun täältä, mutta kun oon sen verran n00b näiden kanssa ja vielä niin mekaaninen ihminen että opin parhaiten esimerkkien ja mallien avulla, niin en sitten saanut niistä mitään tolkkua.
lontoon murre kyllä taittuu, jos jotain linkkejä sais asiaa valottaville sivuille missä olis niitä esimerkkejä joiden kanssa opetella miten asiat toimii ennenkuin alkaa soveltaa ominpäin.

[quote=“v0j, post:3, topic:1528”]udev? lukkotiedostot? en ymmärtänyt tosta siansaksasta sanaakaan, oisko noihin olemassa jotain ymmärrettäviä ohjeita jossain?
jotain epämääräisiä ohjeita FSTABin käytöstä ym löysin sieltä sun täältä, mutta kun oon sen verran n00b näiden kanssa ja vielä niin mekaaninen ihminen että opin parhaiten esimerkkien ja mallien avulla, niin en sitten saanut niistä mitään tolkkua.
lontoon murre kyllä taittuu, jos jotain linkkejä sais asiaa valottaville sivuille missä olis niitä esimerkkejä joiden kanssa opetella miten asiat toimii ennenkuin alkaa soveltaa ominpäin.[/quote]

udev on Linuxin laitteiston hallintapalvelu, joka sinun tapauksessasi on apuscriptojensa toimesta mm. mountannut kamerasi hakemistoon, jota käytät scriptissäsi.

Eli halutessasi voisit laittaa suoraan nykyisen scriptasi suoriutumaan jossain määrin seuraavassa postauksessa kuvatuin ohjein: http://askubuntu.com/questions/25071/how-to-run-a-script-when-a-specific-flash-drive-is-mounted

Lukkotiedostot ovat yleensä ottaen ihan vain tavallisia, jopa tyhjiä, tiedostoja joita käytetään ainoastaan tunnistamaan sovellusten ja scriptien suorittamisen tilaa. Scripta käynnistyy -> tarkistaa onko lukko olemassa -> jos lukko löytyy jäädään odottamaan kunnes lukko vapautuu (poistuu) nukkumalla ja tarkistamalla tietyin väliajoin uusi tilanne -> lukko ei ole enää olemassa, joten luodaan lukko -> suoritetaan toiminnot -> poistetaan lukkotiedosto. Näin päällekkäisiltä saman toiminnon suorittamisilta pitäisi välttyä.

Käytät jo koodissasi lausekkeita

tarkistamaan onko hakemisto olemassa. Käyttämällä parametria tai vipua -f voit tarkistaa onko tavallinen tiedosto olemassa.

Tyhjän tiedoston lukoksi voit luoda esim. komennolla

Komennolla rm voit taas tuhota tiedostoja pysyvästi
rm /tmp/kamera_lukko

Yhdistettynä esim.

#!/bin/bash

# Asetetaa lukkotiedoston nimi muuttujaan
LOCK="/tmp/kamera_lukko"

# Luo lukko
touch $LOCK

if [ -f $LOCK ];then
    echo "Lukko on olemassa!";
fi

# Lukko pois
rm $LOCK

if [ -f $LOCK ];then
    echo "Lukko on olemassa!";
else
    echo "Ei lukkoa!";
fi

Harjoittelu tekee mestarin ja pienin askelin itse oivaltamalla eteenpäin.
http://www.tldp.org/LDP/Bash-Beginners-Guide/html/