Contenu | Rechercher | Menus

Annonce

Ubuntu 16.04 LTS
Commandez vos DVD et clés USB Ubuntu-fr !

Pour en savoir un peu plus sur l'équipe du forum.

Appel à contributeurs pour la doc.

Si vous avez des soucis pour rester connecté, déconnectez-vous puis reconnectez-vous depuis ce lien en cochant la case
Me connecter automatiquement lors de mes prochaines visites.

#1 Le 08/08/2017, à 01: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, à 08: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" 
man bash a écrit :

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 smile

Donut

Hors ligne

#3 Le 08/08/2017, à 09: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 tongue

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, à 09:33)

Hors ligne

#4 Le 08/08/2017, à 12: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 hmm je vais lire toute les doc que vous m'avez passée. Encore merci pour votre aide ^^

Hors ligne

#5 Le 08/08/2017, à 13:40

marin50

Re : Script bash

Merci DonutMan75 la solution proposée sur stack overflow est parfaite ^^

Hors ligne

#6 Le 08/08/2017, à 13: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, à 14: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, à 17:49)

Hors ligne

#8 Le 08/08/2017, à 17: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 ?


eval, c'est mal.

Hors ligne

#9 Le 08/08/2017, à 17:04

marin50

Re : Script bash

Et sur quoi est-je tord ?
Merci big_smile

Dernière modification par marin50 (Le 08/08/2017, à 17:05)

Hors ligne

#10 Le 08/08/2017, à 17: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, à 17:28

marin50

Re : Script bash

oooh oui je n'avais pas fait attention à ca mad

Merci beaucoup de me l'avoir signalé neutral

Hors ligne

#12 Le 08/08/2017, à 17: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, à 17:50

marin50

Re : Script bash

encore mille merci ^^

Hors ligne

#14 Le 08/08/2017, à 19: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.


eval, c'est mal.

Hors ligne

#15 Le 08/08/2017, à 19:45

marin50

Re : Script bash

Watael a écrit :

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, à 20: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é.


eval, c'est mal.

Hors ligne

#17 Le 08/08/2017, à 21:13

kholo

Re : Script bash

j'hadaureu !!! lol
l'ortograffe sait l'avis !!! roll

Hors ligne

#18 Le 09/08/2017, à 00: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 hmm je pense regarder du coté de rc.local

Hors ligne