Pages : 1
#1 Le 08/08/2017, à 00:09
- marin50
Script bash
Bonjour tout le monde !
voila je suis en train de faire un petit script mais j'aurai besoins de votre aide pour le déboguer
voici le code en question :
function start{
exec "python /home/administrateur/Desktop/fan.py & "
x=pidof python3 | cut -d " " -f 1
return ${x}
}
pid=start
while true
do
x= ps -ejH | grep pid | cut -d " " -f -1
if [ x != pid ];
then
pid=start
if
done
et j'obtient ce message d'erreur :
./test.sh: line 4: syntax error near unexpected token `exec'
./test.sh: line 4: `exec "python /home/administrateur/Desktop/fan.py & " '
Voila merci pour votre aide ^^
Hors ligne
#2 Le 08/08/2017, à 07:16
- DonutMan75
Re : Script bash
Hello,
quelques remarques rapides :
1) Ne manque-t'il pas #! /bin/sh en début de script ?
2) Concernant l'utilisation de exec
Alors déjà est-ce vraiment un exec qu'il faut à cet endroit là ? Ca va écraser le reste de ton programme et ne pas rendre la main il me semble...
Mais sinon avec le man de bash (ci-dessous), je dirais qu'il faudrait plutôt
exec "python" "/home/administrateur/Desktop/fan.py"
exec [-cl] [-a name] [command [arguments]]
If command is specified, it replaces the shell. No new process is created. The
arguments become the arguments to command. If the -l option is supplied, the shell
places a dash at the beginning of the zeroth argument passed to command. This is
what login(1) does. The -c option causes command to be executed with an empty envi‐
ronment. If -a is supplied, the shell passes name as the zeroth argument to the
executed command. If command cannot be executed for some reason, a non-interactive
shell exits, unless the execfail shell option is enabled. In that case, it returns
failure. An interactive shell returns failure if the file cannot be executed. If
command is not specified, any redirections take effect in the current shell, and the
return status is 0. If there is a redirection error, the return status is 1.
3) Pour le pid en ligne 5 je mettrais
x=$(pidof python3 | cut -d " " -f 1)
Idem plus bas :
x=$(ps -ejH | grep pid | cut -d " " -f -1)
4) L'appel à la fonction pid=start, devrait plutôt être pid=start()
Mais je ne me souviens plus comment on récupère les valeurs de sortie de shell...
5) En gros si j'ai bien compris ce que tu veux faire :
- je lance un script pyhton
- je vérifie en permanence s'il existe bien
- s'il n'existe plus, je le relance
Je me demande s'il n'existe pas une façon plus simple et moins consommatrice de ressource (cf. ta boucle infinie avec un ps dedans....)
Une réponse ici :
https://stackoverflow.com/questions/696 … if-it-dies
Si tu veux que le script python ne soit pas en avant plan, tu peux aussi exécuter ton script shell avec le "&" à la fin...
Bon courage pour la suite
Donut
Hors ligne
#3 Le 08/08/2017, à 08:31
- Hizoka
Re : Script bash
Bonjour,
en effet, je ne vois pas l'interet du exec, il suffit de faire :
python ton_fichier &
et je remplacerais :
x=pidof python3 | cut -d " " -f 1 # Non fonctionnel car il faut encadrer la commande par $() ou anciennement ``
return ${x}
par
pids=($(pidof python3)) # Création d'une liste
return ${x[1]} # Renvoie le 2e élément
Ça évite un pipe et un cut inutile.
x= ps -ejH | grep pid | cut -d " " -f -1 # Non fonctionnel car il faut encadrer la commande par $() ou anciennement `` et ne pas mettre d'espace apres le =, et normalement ce ne sont pas des espaces mais des tab
if [ x != pid ]; # Il faut indiquer que ce sont des variables... avec ${} ou au moins $, le ; est inutile si tu sautes une ligne
par
x=($(ps -ejH | grep pid))
if [[ ${x[-1]} != ${pid} ]]
pid=start
par
pid=$(start)
en fait tout était faux quoi
et en entete : #!/bin/bash
un peu de lecture necessaire je pense : http://abs.traduc.org/abs-fr
Dernière modification par Hizoka (Le 08/08/2017, à 08:33)
KDE Neon 64bits
Tous mes softs (MKVExtractorQt, HizoSelect, HizoProgress, Qtesseract, Keneric, Services menus...) sont sur github
Hors ligne
#4 Le 08/08/2017, à 11:29
- marin50
Re : Script bash
merci beaucoup tout le monde il est vri que je me suis lancé un peu trop vite sur les script bash et c'est tres différent du python je vais lire toute les doc que vous m'avez passée. Encore merci pour votre aide ^^
Hors ligne
#5 Le 08/08/2017, à 12:40
- marin50
Re : Script bash
Merci DonutMan75 la solution proposée sur stack overflow est parfaite ^^
Hors ligne
#6 Le 08/08/2017, à 12:55
- melixgaro
Re : Script bash
salut,
et sauf erreur, une fonction bash ne peut pas retourner de valeur à part le statut de sortie 0, 1 etc. Pour que la syntaxe truc=$(function) marche, il faut que function fasse des echo (ou des print) des données à stocker dans la variable truc.
Linux depuis ~2007. Xubuntu seulement.
Hors ligne
#7 Le 08/08/2017, à 13:44
- marin50
Re : Script bash
(re)bonjour en suivant la solution donné sur stack overflow j'ai mit ce code
#!/bin/bash
until python3 /home/administrateur/Desktop/fan.py; do
echo "Server 'fan control' crashed with exit code $?. Respawning.." | msmtp marin.do@hotmail.fr
sleep 1
done
Ce code fonctionne quand on l'execute dans un shell.
maintenant je cherche à automatisée ce script pour qu'il demare à chaque démarrage de l'ordinateur.
j'ai donc rajouté cette ligne cron
@reboot /usr/local/bin/fan.sh
mais le prgogramme python ne démarre pas automatiquement aprés un reboot.
Pour info voici le code python ci vous voulais savoir ce qu'il y a derrier le code bash ^^
from serial import *
from math import ceil
from os import system
from time import time,localtime
first_time=0
iteration=False
test=True
mail=[]
admin=""
def check_time():
global iteration,first_time
#86400 sec en 1 journée
if time()>first_time+86400:
print("renouvellement iteration")
first_time=0
iteration=False
def send_alert(txt,all_):
if all_:
for i in mail:
system("echo '"+txt+"' | msmtp "+i)
else:
system("echo '"+txt+"' | msmtp "+admin)
def write_html(DATA):
#fichier=open("/opt/lampp/htdocs/projet-site-serveur/info.html","w")
fichier=open('test.html','w')
fichier.write('<!DOCTYPE html><html><head><meta charset="UTF-8"><title>info serveur</title><link rel="stylesheet" type="text/css" href="test.css"></head><h1>Information du serveur</h1><body><table><tr><th></th><th>température</th><th>humidité</th></tr><tr><td>cpu</td><td>'+DATA[0][0]+'</td><td>'+DATA[1][2]+'</td></tr><tr><td>entrée</td><td>'+DATA[0][2]+'</td><td>'+DATA[1][0]+'</td></tr><tr><td>sortie</td><td>'+DATA[0][1]+'</td><td>'+DATA[1][1]+'</td></tr></table><table><tr><th></th><th>tension</th></tr><tr><td>12V alimentation serveur<br></td><td>'+DATA[2][1]+'</td></tr><tr><td>5V alimentation serveur</td><td>'+DATA[2][0]+'</td></tr><tr><td>12V alimentation arduino et ventilateur<br></td><td>'+DATA[2][2]+'</td></tr></table></body></html> ')
fichier.close()
def connect(port,bauds,time):
ser=Serial(port,bauds,EIGHTBITS,PARITY_NONE,STOPBITS_ONE,timeout=time)
return ser
def write(txt,serial_connection):
serial_connection.write(txt.encode('utf-8'))
def ready(serial_connection):
return serial_connection.readlines()
def shut_down():
if test:
alert_txt="'ceci est un test pour le message pre-extinction du serveur \n si vous recevez ce message veuillez renvoyer un mail de confirmation à admin mail\n En vous remerciant, admin"
else:
alert_txt="'extinction du serveur non prevue dans 1 minutes, En m'excusant du dérangement. Admin"
send_alert(alert_txt,False)
time_stop=localtime(time()+60)
hour=time_stop[3]
minute=time_stop[4]
system("shutdown -t "+str(hour)+":"+str(minute))
def send_pwm(temperature,serial_connection):
global iteration,first_time
if int(temperature[2])>30:
if not(iteration):
iteration=True
send_alert("temperature de rentrée d air élevée",False)
first_time=time()
if int(temperature[0])>40:
write("255",serial_connection)
elif int(temperature[1])>30:
write("255",serial_connection)
else:
total=0
for i in temperature:
total+=int(i)
total=total/3
total=ceil(total*7.65)+10
while total%10!=0:
total+=1
if total>255:
total=255
elif total<10:
total=10
write(str(total),serial_connection)
def traitement(DATA,x):
if DATA=="0":
shut_down()
else:
DATA=DATA.split("|")
for i in range(len(DATA)):
DATA[i]=DATA[i].split("_")
send_pwm(DATA[0],x)
write_html(DATA)
x=connect("/dev/ttyUSB0",9600,1)
while True:
txt=ready(x)
if txt!=[]:
for line in txt:
DATA=str(line)[2:-5]
traitement(DATA,x)
if iteration:
check_time()
Dernière modification par marin50 (Le 08/08/2017, à 16:49)
Hors ligne
#8 Le 08/08/2017, à 16:02
- Watael
Re : Script bash
je ne suis pas d'accord !
je l'explique très bien dans un message sur un autre forum.
Sauras-tu le retrouver ?
Connected \o/
Welcome to sHell. · eval is evil.
Hors ligne
#9 Le 08/08/2017, à 16:04
- marin50
Re : Script bash
Et sur quoi est-je tord ?
Merci
Dernière modification par marin50 (Le 08/08/2017, à 16:05)
Hors ligne
#10 Le 08/08/2017, à 16:26
- melixgaro
Re : Script bash
à marin,
tu devrais modifier ton message précédent, celui avec ton script python, pour supprimer les informations sensibles : noms, adresses de courriel. pas la peine que ça traîne ici, remplace-les par : Albert Dupont, john.doe@email.com etc
Linux depuis ~2007. Xubuntu seulement.
Hors ligne
#11 Le 08/08/2017, à 16:28
- marin50
Re : Script bash
oooh oui je n'avais pas fait attention à ca
Merci beaucoup de me l'avoir signalé
Hors ligne
#12 Le 08/08/2017, à 16:48
- melixgaro
Re : Script bash
de rien, y a encore des trucs dans la fonction shut_down
Linux depuis ~2007. Xubuntu seulement.
Hors ligne
#13 Le 08/08/2017, à 16:50
- marin50
Re : Script bash
encore mille merci ^^
Hors ligne
#14 Le 08/08/2017, à 18:32
- Watael
Re : Script bash
Et sur quoi est-je tord ?
d'écrire tord, et non tort,
de faire référence à une discussion sur un forum concurrent,
et de ne pas donner de lien vers la-dite discussion.
Connected \o/
Welcome to sHell. · eval is evil.
Hors ligne
#15 Le 08/08/2017, à 18:45
- marin50
Re : Script bash
Et sur quoi est-je tord ?
d'écrire tord, et non tort,
de faire référence à une discussion sur un forum concurrent,
et de ne pas donner de lien vers la-dite discussion.
excusez moi de reprendre la solution que l'on m'a donné dans la première réponse mais bon ...
Ensuite si tu ne veut pas m'aider tout en comprenant que derrière chaque mot il y a une personne, passé sont chemin me parait une bonne solution
Hors ligne
#16 Le 08/08/2017, à 19:36
- Watael
Re : Script bash
passé sont chemin me parait
tu le fais exprès ?
quand on sait qu'on a des lacunes dans un domaine, on cherche de l'aide :
orthographe
conjugaison
grammaire
et effectivement, je suis passé un peu vite sur les premiers messages, et je n'ai pas vu que c'était une suggestion de DonutMan, avec un lien.
désolé.
Connected \o/
Welcome to sHell. · eval is evil.
Hors ligne
#17 Le 08/08/2017, à 20:13
- kholo
Re : Script bash
j'hadaureu !!!
l'ortograffe sait l'avis !!!
Hors ligne
#18 Le 08/08/2017, à 23:06
- marin50
Re : Script bash
je suis désolé si dans mes paroles je t'insulte ou t'ai insulté. Mais l'orthographe n'est pas la raison qui ma fait venir ici ^^. Toujours est-il que je n'est pas réussi à lancer mon script je pense regarder du coté de rc.local
Hors ligne
Pages : 1