Page 2 sur 2

Re: [resolut] Conversion dans un script . sh

Publié : 26 oct. 2015, 11:45
par deennoo
J'ai un vrai probleme :

Voici mon script :

Code : Tout sélectionner

#!/bin/bash


# GET sensor Value


#Rainain
	#actual
rainin=$(curl -s "http://192.168.0.21:8080/json.htm?type=devices&rid=9"| jq -r .result[].RainRate)
echo "Pluie maintenant : ${rainin}mm"

	#daily
dailyrainin=$(curl -s "http://192.168.0.21:8080/json.htm?type=devices&rid=9"| jq -r .result[].Rain)
echo "Pluie sur la journée : ${dailyrainin}mm/Jour"


#External Temp Hum & dewpoint
tempc=$(curl -s "http://192.168.0.21:8080/json.htm?type=devices&rid=150"| jq -r  .result[].Temp)
echo "Temperature exterieur : ${tempc} c"
#need some math to converte on C to F thx vil1driver
tempf=$(echo "scale=2;((9/5) * $tempc) + 32" | bc)
echo "temp en °f : ${tempf} f"
humidity=$(curl -s "http://192.168.0.21:8080/json.htm?type=devices&rid=150"| jq -r  .result[].Humidity)
echo "Humidité exterieur : ${humidity}%"

dewptc=$(curl -s "http://192.168.0.21:8080/json.htm?type=devices&rid=150"| jq -r  .result[].DewPoint)
echo "Point de rosée : ${dewptc} c"
#need some math to converte on C to F thx vil1driver
dewptf=$(echo "scale=2;((9/5) * $dewptc) + 32" | bc)
echo "Point de rosée : ${dewptf} f"

#Baro
barohp=$(curl -s "http://192.168.0.21:8080/json.htm?type=devices&rid=8"| jq -r  .result[].Barometer)
echo "Pression : ${barohp} HPA"
#need some math to converte on HPA to Inch
baroin=`echo "0.0295299830714*$barohp" | bc`
echo "Pression en Inch : ${baroin} in"


#Wind direction :
winddir=$(curl -s "http://192.168.0.21:8080/json.htm?type=devices&rid=267"| jq -r .result[].Direction)
echo "direction du vent : ${winddir}"

#WUind gust :
wgskmh=$(curl -s "http://192.168.0.21:8080/json.htm?type=devices&rid=267"| jq -r .result[].Gust| tr -d '"')
echo "vitesse des rafales : ${wgskmh} km/h"
#need some math to translat on mph
wgsmph=`echo "0.621371192*$wgskmh" | bc`
echo "Viteese des rafales : ${wgsmph} mph"

#WUind speed :
wspkmh=$(curl -s "http://192.168.0.21:8080/json.htm?type=devices&rid=267"| jq -r .result[].Speed| tr -d '"')
echo "vitesse du vent : ${wspkmh} km/h"
#need some math to translat on mph
wsmph=`echo "0.621371192*$wspkmh" | bc`
echo "vitesse du vent : ${wsmph} mph"



#formating info for Update WU and send it
curl "http://weatherstation.wunderground.com/weatherstation/updateweatherstation.php?ID=******&PASSWORD=****&dateutc=now&winddir=${winddir}&windspeedmph=${wsmph}&windgustmph=${wgsmph}&tempf=${tempf}&rainin=${rainin}&dailyrainin=${dailyrainin}&baromin=${baroin}&dewptf=${dewptf}&humidity=${humidity}&softwaretype=vws%20versionxx&action=updateraw"
Lorsque j'execute mon script depuis une fenetre du terminal pas de probleme il met bien ma station meteo a jour.

Si je le lance depuis un crontab, des infos sont bien envoyé mais tout a 0 vous auriez une idee ?

Re: Conversion dans un script . sh

Publié : 28 oct. 2015, 08:24
par rimram31
La différence entre une session terminal et en crontab est l'environnement (resultat de env). Sur ton problème, je miserai sur le PATH variable qui permet de définir les répertoires ou trouver les binaires/programmes que l'on pouvoir appeler justement sans path complet.

Je vois que tu utilises curl, jq (bonne pioche!) essaie pour chaque programme de mettre le chemin complet d'accès au programme (ou via variable définies en debut de script). Pour tester, tu peux ecrire/log dans un fichier et mettre une intervalle très court en crontab.

Pour info (je suis sysadmin aussi parfois ...) un script destiné a être en cron doit toujours être testé en cron justement :-)

Re: Conversion dans un script . sh

Publié : 28 oct. 2015, 10:27
par deennoo
Merci de ta réponse mais c'est un peu du chinois pour moi qui debut vraiment de 0

Curl et JQ merci a Patrice d'avoir fait un tuto sur le blog.

Comment je connais les chemins complet d'accès au programme ?

Comment je test en cron ?

Re: Conversion dans un script . sh

Publié : 28 oct. 2015, 16:26
par rimram31
Oki,

L'environnement est un ensemble de variables renseignées par le système que tu utilises sans le savoir (taper env pour voir la liste et valeurs). En particulier une variable qui s'appelle PATH qui permet d'exécuter des commandes sans devoir taper le chemin complet. Pour curl, il faudrait taper tout /usr/bin/curl mais PATH est gérée justement par le système pour te faciliter la vie (liste de chemins séparés par des : ).

Pour trouver les chemins complets de curl ou jq, la commande whereis devrait te le dire => whereis jq. Copie le chemin complet dans ton script, au lieu de jq => /usr/bin/jq par ex et pour tester ton script entre le en crontab avec exécution toute les minutes (* * * * ...) en remplaçant ta commande finale par un echo si tu veux éviter de l'exécuter tout le temps (en test) ou echo "..." >> /tmp/fichier_de_log.

Au besoin fait des echo >> intermédiaires pour savoir ou ton script ne fonctionne pas comme prévu (ce n'est peut-être pas les paths ...)

Re: Conversion dans un script . sh

Publié : 28 oct. 2015, 17:02
par deennoo
Merci de tes réponses

J'ai trouver le pourquoi du comment :

J'avais pourtant fait un chmod 777 sur mon script
puis j'avais edit cron par : sudo crontab -e
et ensuite : */2 * * * * /home/pi/domoticz/scripts/shell/./updatewu.sh

mais cela ne fonctionnait pas
je viens de rajouter sudo a */2 * * * * /home/pi/domoticz/scripts/shell/./updatewu.sh

ce qui donne

Code : Tout sélectionner

*/2 * * * * sudo /home/pi/domoticz/scripts/shell/./updatewu.sh
et cela fonctionne, je ne comprends pas pk ayant deja editer le cron par sudo

Re: Conversion dans un script . sh

Publié : 28 oct. 2015, 17:11
par vil1driver
tu devrais essayer crontab sans sudo ;)

crontab est un fichier utilisateur, en lançant avec sudo tu édit celui de root
sans sudo, celui de l'utilisateur actuel (pi)

Le fichier est stocké dans /var/spool/cron/crontabs/<user> mais doit seulement être édité par l'intermédiaire de la commande crontab.

Re: Conversion dans un script . sh

Publié : 28 oct. 2015, 17:32
par deennoo
vil1driver a écrit : crontab est un fichier utilisateur, en lançant avec sudo tu édit celui de root
sans sudo, celui de l'utilisateur actuel (pi)
Ok ! moi qui pensais que : editer le cron de Sudo me faisait gagner le fait d avoir a rajouter Sudo au debut de certaines plannification...

Re: Conversion dans un script . sh

Publié : 28 oct. 2015, 17:45
par vil1driver
ton script n'as pas besoin d'être lancé en root, tu disais que tu y parvenais avec l'utilisateur pi ?

sinon je ne ferais pas comme ça

Code : Tout sélectionner

*/2 * * * * sudo /home/pi/domoticz/scripts/shell/./updatewu.sh
mais comme ceci

Code : Tout sélectionner

*/2 * * * * /home/pi/domoticz/scripts/shell/updatewu.sh

Re: Conversion dans un script . sh

Publié : 29 oct. 2015, 09:59
par rimram31
deennoo a écrit :... et cela fonctionne, je ne comprends pas pk ayant deja editer le cron par sudo
+1 sur le commentaire de vil1driver:
- inutile de mettre ./ si tu mets un chemin complet, le ./ signifie => dans le répertoire courant
- je ne vois pas en quoi ton script qui ne fait que du curl et jq aurait besoin de privilèges root

Peut-être lié a mon explication, l'environnement, différent entre pi et root (+ les droits), qui ferait que ton script s'exécute en étant root et pas en etant pi. Que se passe-t-il lorsque tu exécutes ton script avec le user pi et sans sudo -> simplement /home/pi/domoticz/scripts/shell/updatewu.sh dans un terminal ? Ou sont tes binaires curl et jq et le user pi a-t-il les droits d'exécuter ces binaires ? => si tu tapes simplement curl ou jq dans un terminal ?