View Full Version : Niubbo chiede supporto su lancio secondo file .sh da primo .sh...
DjDiabolik
10-07-2011, 17:46
Ciao ragazzi.. in pratica vi spiego cos'è che voglio ottenere:
Io ho 2 file .sh... esempio 1.sh e 2.sh... io parto con l'esecuzione di 1.sh che all'interno poi richiama il 2.sh.
A questo punto però mentre il 2.sh è in esecuzione a me serve che l'1.sh aspetti il termine del 2.sh e non che i due file siano processati in multitasking.
In pratica essendo un pò + bravino su ambiente windows e nello scripting in batch voglio ottenere quello che invece il batch fa normalmente.... perchè proprio se da un batch io richiamo un secondo file batch il primo interrompe l'esecuzione e aspetta il terminare del secondo batch.....
Sono stato chiaro ?
puoi provare ad usare il comando wait, nel tuo caso sarebbe una cosa del tipo:
2.sh &
PID=$!
wait $PID
oppure
2.sh &
wait
wait ferma l'esecuzione dello script finchè tutti i jobs in background non sono terminati, oppure finchè il job (job id) o processo (process id) passati terminano.
DjDiabolik
11-07-2011, 00:43
mmm.. provo.. e questo praticamente va nell'1.sh subito dopo aver richiamato il 2.sh giusto ?
si va nel file 1.sh
tieni conto che:
2.sh &
già esegue il file 2.sh (in background).
zarazoski
11-07-2011, 11:08
e nello scripting in batch voglio ottenere quello che invece il batch fa normalmente.... perchè proprio se da un batch io richiamo un secondo file batch il primo interrompe l'esecuzione e aspetta il terminare del secondo batch.....
Sono stato chiaro ?
perche', se in 1.sh chiami semplicemente 2.sh cosa succede ?
DjDiabolik
11-07-2011, 11:41
allora nel 2.sh uso un paio di volte il comando wget poi di volta in volta mi costruisco un output da mostrare a schermo.
Non riesco a capire perchè se io implemento i wget nel 1.sh quest'ultimi non funzionano e bloccano l'esecuzione dello script stesso mentre cosi appunto messi un file .sh a parte vengono eseguiti tranquillamente.
Cmq sia l'1.sh al suo termine mostra a schermo un'output cioè l'output generato dal 2.sh (in pratica una sorta di log dei comandi wget) però a me appunto tutt'ora accade che:
- lancio 1.sh
- 1.sh richiama il 2.sh
usando appunto ".\2.sh &" l'1.sh non mi aspetta la fine dell'esecuzione del 2.sh ma me lo esegue tipo multitasking e quindi poi genera tutti errori appunto perchè non trova i log generati.
Ho provato a mettere uno "sleep x" ma non so poi quando potrebbero impiegare i 3 wget..... cercando in rete ho poi trovato un suggerimento che diceva di mettere "wait" subito dopo la chiamata al 2.sh quindi ho fatto x esempio :
...
...
.\2.sh &
wait
...
...
Ma non riesco ad ottenere ciò che voglio io.....
a seconda di come è fatto il file richiamato può funzionare o meno
Ad esempio:
file 2.sh:
#!/bin/bash
echo 2 - start
sleep 3 &
echo 2 - stop
file 1.sh:
#!/bin/bash
echo 1 - start
. 2.sh
echo 1 - stop
se esegui 1.sh avrai come output:
1 - start
2 - start
2 - stop
1 - stop
ma il programma termina immediatamente senza aspettare 3 secondi, questo perchè un comando/programma nel file richiamato è andato in background.
Modificando 2.sh aggiungendo semplicemente il comando wait in questo modo:
#!/bin/bash
echo 1 - start
. 2.sh
wait
echo 1 - stop
si risolve questa eventualità.
Ovvio poi che a seconda dei casi bisogna prestare attenzione ed usare la soluzione migliore.
zarazoski
11-07-2011, 11:46
...
tutt'ora accade che:
- lancio 1.sh
- 1.sh richiama il 2.sh
usando appunto ".\2.sh &" l'1.sh non mi aspetta la fine dell'esecuzione del 2.sh ma me lo esegue tipo multitasking e quindi poi genera tutti errori appunto perchè non trova i log generati.
:confused:
e richiamarlo semplicemente con .\2.sh ?
se c'è qualche programma che forka in background ovviamente richiamarlo direttamente non funziona, con il wait dovrebbe, se non funziona nemmeno così, beh bisogna vedere il tuo 2.sh, dovresti postarlo così ci rendiamo conto..
DjDiabolik
11-07-2011, 11:59
:confused:
e richiamarlo semplicemente con .\2.sh ?
gia provato non funziona.......
Anche mettendo il wait sembra non funzionare.... è alquanto strano.
zarazoski
11-07-2011, 13:13
gia provato non funziona.......
:confused:
se lo chiami nel modo piu' semplice, la chiamata diretta e' sincrona: quando termina il 2.sh, l'esecuzione ritorna al 1.sh
lascia perdere le & e wait
evidentemente fai qualche pasticcio nel 2.sh con i wget: quoto blair, prova a postarlo (se non c'e' niente di riservato :O)
DjDiabolik
11-07-2011, 19:51
allora.... il 2.sh è questo:
#!/bin/sh
echo
echo " Reload Setting in corso.."
echo
echo "_____________________________"
echo
sleep 3
echo "Reload Network"
wget -q -P /usr/bin -O /tmp/ReloadNetwork.logreload "http://root:xxxxxx@localhost/cgi-bin/reloadNetworks"
ReloadNetwork="$(grep "" /tmp/ReloadNetwork.logreload)"
echo $ReloadNetwork
echo
echo "Reload Setting"
wget -q -P /usr/bin -O /tmp/ReloadSetting.logreload "http://root:xxxxxx@localhost/cgi-bin/reloadSettings"
ReloadSetting="$(grep "" /tmp/ReloadSetting.logreload)"
echo $ReloadSetting
echo
echo "Reload UserBouquets"
wget -q -P /usr/bin -O /tmp/ReloadUserBouquets.logreload "http://root:xxxxx@localhost/cgi-bin/reloadUserBouquets"
ReloadUserBouquets="$(grep "" /tmp/ReloadUserBouquets.logreload)"
echo $ReloadUserBouquets
echo
echo
echo "Reload settings riuscito, premere EXIT per chiudere la finestra.."
rm -f /tmp/*.logreload
exit 0
e l'1.sh ora è cosi:
#!/bin/sh
./2.sh &
wait
exit 0
Ricapitolo.. in pratica io eseguo l'1.sh che al suo termine mostra un'output a schermo da se..... però per far andare i wget devo per forza eseguirli nell'sh esterno altrimenti non so per quale motivo i wget non vanno (seppur ho impostato correttamente gli attributi e vengono eseguiti anch'essi da un patch con attributi 777).
Però cosi facendo io ottengo l'output a schermo quando invece in background il 2.sh è ancora in esecuzione.....e quindi l'output a schermo (che sono quindi i vari echo) escono troncati.
*EDIT*
Pensavo non fosse necessario ma a questo punto lo dico... è un decoder Enigma1.
zarazoski
11-07-2011, 21:03
editato
zarazoski
11-07-2011, 21:45
wget -q -P /usr/bin -O /tmp/ReloadNetwork.logreload "http://root:xxxxxx@localhost/cgi-bin/reloadNetworks"
ReloadNetwork="$(grep "" /tmp/ReloadNetwork.logreload)"
echo $ReloadNetwork
non capisco il -P e il -O che sono in conflitto, e il grep :confused:
non sara' meglio farlo cosi' ?:
wget -q -O /tmp/ReloadNetwork.logreload "http://root:xxxxxx@localhost/cgi-bin/reloadNetworks"
cat /tmp/ReloadNetwork.logreload
comunque non ha senso fare due script: lancia direttamente il 2.sh
e finalmente ho capito che non avevo capito cosa volevi fare :D
per la cronaca, ho copiato il tuo script 2.sh su un mio decoder (ho solo tolto il -P dal wget) e funziona...
pure io non capisco il grep...
io ho provato i due script e funzionano perfettamente (io non ho tolto il -P), ho solo cambiato path e poi ho levato quei grei sostituendoli ad un cat.
ps: ha ragione zarazoski riguardo il -P...
Ricapitolo.. in pratica io eseguo l'1.sh che al suo termine mostra un'output a schermo da se..... però per far andare i wget devo per forza eseguirli nell'sh esterno altrimenti non so per quale motivo i wget non vanno (seppur ho impostato correttamente gli attributi e vengono eseguiti anch'essi da un patch con attributi 777).
cosa vuol dire non vanno? :confused:
Però cosi facendo io ottengo l'output a schermo quando invece in background il 2.sh è ancora in esecuzione.....e quindi l'output a schermo (che sono quindi i vari echo) escono troncati.
non capisco, da quegli script è 2.sh che stampa l'output, non 1.sh, e come fa 1.sh a ritornare senza prima aver eseguito tutto :confused:
E' possibile che se i file sono quandi l'ultima stampa richieda un determinato tempo ed il processo termini prima che tutto l'output sia stato visualizzato. E' questo il problema?
ps: puoi anche eliminare i file intermedi in questo modo:
VAR1=`wget -qO - "http://....."`
echo "$VAR1"
DjDiabolik
11-07-2011, 23:48
wget -q -P /usr/bin -O /tmp/ReloadNetwork.logreload "http://root:xxxxxx@localhost/cgi-bin/reloadNetworks"
ReloadNetwork="$(grep "" /tmp/ReloadNetwork.logreload)"
echo $ReloadNetwork
non capisco il -P e il -O che sono in conflitto, e il grep :confused:
non sara' meglio farlo cosi' ?:
wget -q -O /tmp/ReloadNetwork.logreload "http://root:xxxxxx@localhost/cgi-bin/reloadNetworks"
cat /tmp/ReloadNetwork.logreload
comunque non ha senso fare due script: lancia direttamente il 2.sh
e finalmente ho capito che non avevo capito cosa volevi fare :D
per la cronaca, ho copiato il tuo script 2.sh su un mio decoder (ho solo tolto il -P dal wget) e funziona...
Allora se lo lanci da telecomando.. dal pannello di controllo e dalla sezione script il wget non funziona.
il -P è per far eseguire il wget da una cartella con le autorizzazioni.... poi il grep e l'echo è per far si di fare andare a capo il tutto e far mostrare un'output almeno un pò ordinato perchè ho provato col cat solo e mi stampava tutto su una riga.
Ho provato in diversi modo ma come detto provate a lanciare lo script dal pannello di controllo e vedrete che non funziona ovviamente rinominato tipo script00.sh.
il -P è per far eseguire il wget da una cartella con le autorizzazioni.... poi il grep e l'echo è per far si di fare andare a capo il tutto e far mostrare un'output almeno un pò ordinato perchè ho provato col cat solo e mi stampava tutto su una riga.
che il -P faccia quello siamo daccordo, il problema è utilizzardo insieme a -O..
per quanto riguarda la stampa, è normale che un echo stampi in quella maniera, per ovviare al problema basta mettere il testo da stampare tra virgolette, ad esempio:
VAR1=`wget -qO - "http://....."`
echo "$VAR1"
Ho provato in diversi modo ma come detto provate a lanciare lo script dal pannello di controllo e vedrete che non funziona ovviamente rinominato tipo script00.sh.
il problema non è lo script, prova a lanciarlo da una qualsiasi console e vedrai che funziona...
DjDiabolik
11-07-2011, 23:54
si che da console funziona... ma io è da telecomando che devo lanciarlo :)
*EDIT*
E se lo lanci da telecomando non so il motivo ma il wget non viene eseguito... e si blocca l'esecuzione.
zarazoski
12-07-2011, 09:02
Allora se lo lanci da telecomando.. dal pannello di controllo e dalla sezione script il wget non funziona.
il -P è per far eseguire il wget da una cartella con le autorizzazioni.... poi il grep e l'echo è per far si di fare andare a capo il tutto e far mostrare un'output almeno un pò ordinato perchè ho provato col cat solo e mi stampava tutto su una riga.
Ho provato in diversi modo ma come detto provate a lanciare lo script dal pannello di controllo e vedrete che non funziona ovviamente rinominato tipo script00.sh.
negativo su tutta la linea :D
ieri ho fatto dei test sul mio DB enigma1
-a me funziona anche lanciato da telecomando come userscript (l'ho messo come /var/scripts/prova_userscript.sh) dopo un chmod a+x ovviamente. Dove lo metti tu ?
-il -P serve per impostare la cartella dove scaricare (-P Set directory prefix to DIR)
-grep o cat: cosa devi formattare ? a me ritorna solo 3 caratteri "+ok" (in caso di errore non lo so)
vBulletin® v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.