2009-09-27 12 views
1

J'ai une base de données SQlite est rempli quand quelqu'un ajoute un nom de fichier et dir, alors je veux que le script lise les 3 nouvelles entrées (faites avec le " LIMIT 3 ") alors je veux que ce script prenne ces 3 entrées et démarre le" script1.sh "pour chacune d'entre elles, puis une fois que le script1 a fini l'un des 3, je veux qu'il regarde dans la base de données SQlite et vérifie s'il y a de nouveaux entires et répétez. (donc un peu comme une file d'attente) NOTE, à la fin de script1.sh il y a une commande qui va supprimer son entrée de la DB SQlite. Donc, fondamentalement, je veux que le script vérifie la base de données SQlite à chaque fois qu'un script script1.sh se termine.Boucle SQlite3 base de données en continu, lorsque la requête a trouvé exécuter le script pour le premier 3

Jusqu'à présent, j'ai:

#!/bin/bash 

sqlite3 /database.db "SELECT * FROM main ORDER BY mKey ASC LIMIT 3" | while read file 
do 
fileName=`echo "$file" | awk '{split($0,a,"|"); print a[2]}'` 
echo "$fileName" 

    #Run script 
    ./script1.sh "$fileName" "$file" 


done 
+1

Que devrait faire le script s'il n'y a rien de nouveau? – DigitalRoss

+0

Continuez à vérifier la base de données pendant 5 secondes. Si possible, une sorte de commande de surveillance pour attendre que quelque chose de nouveau arrive. – Mint

+0

Malheureusement, ce que vous voulez, c'est vraiment pousser la limite de ce que peut faire bash. Comme vous le savez, j'ai pris une fissure ci-dessous avec seulement des résultats partiels. Les problèmes sont (1) la commande shell sqlite3 ne renvoie pas d'erreurs. (2) bash n'a pas un bon moyen d'attendre la fin du processus * next *, il peut seulement attendre un ou plusieurs d'entre eux. C'est ennuyeux, car l'appel système brut * n'attend que le suivant. Le script pourrait piéger SIGCHLD (et donc obtenir le contrôle à la sortie de chaque enfant) mais j'étais inquiet des conditions de course en faisant l'arithmétique du shell dans un gestionnaire de signal. – DigitalRoss

Répondre

1
#!/bin/bash 

key=0 
while :; do 
    sqlite3 -column ./test.db \ 
    "SELECT * FROM main WHERE mKey > $key ORDER BY mKey ASC LIMIT 3" > tmpFile 
    lastKey=$key 
    while read k f; do 
     key=$k 
     echo start script1 on $f here current key is $k 
    done < tmpFile 
    [ $key -eq $lastKey ] && sleep 1 
done 

Je ne savais pas que vous vouliez vraiment le 3 plus récent, puisque vous avez aussi dit que vous vouliez une file d'attente, alors je suis le suivant 3 à chaque fois, en commençant par la première.

+0

Ok, merci. C'est la moitié de ce dont j'ai besoin, j'ai aussi besoin de faire fonctionner le 3 simultanément, pas l'un après l'autre. Je verrai ce que je peux en tirer. – Mint

+0

BTW, mon script prototype a été testé sur une base de données sqlite3 avec le schéma suivant: 'CREATE TABLE principal (mKey INTEGER PRINCE KEY AUTOINCREMENT, pathName);' – DigitalRoss

+0

Cheers. Fini par ne pas utiliser cette méthode, semblait trop compliqué. Il suffit d'utiliser votre boucle while infinie, puis d'utiliser sqlite3 pour faire le reste. – Mint

1

Vous n'avez pas besoin d'utiliser echo et awk, Bash peut faire pour vous:

saveIFS=$IFS 
IFS='|' 
fileName=(${file})  # make an array 
fileName=${fileName[2]} # get an element 
IFS=$saveIFS    # put it back like you found it 

Il vous manque un "done", par le chemin.