Résolu le 14-01-24 Script en bash

Postez ici vos scripts Bash, Python, etc.
salinois
Messages : 35
Enregistré le : ven. 5 janv. 2024 16:55
Localisation : jura

Script en bash

Message par salinois »

bonjour,
un ami m'a donné un script en bash pour tester des valeurs sur un fichier de base de données
mais j'ai des erreurs quand je le lance. voici le script et les erreurs.

Code : Tout sélectionner

#!/bin/bash
#
#
cd /usr/lib/weewx   # le repertoire où se situe mon fichier de base de données
echo ""
for FILE in *.sdb
do
  DIFF="$(($(date +%s) - $(date -r ${FILE} +%s)))"
  if [ ${DIFF} -gt 600 ]
  then
      echo -n "ERROR"
  else
      echo -n "OK   "
  fi
  echo "   ${FILE} was last modified ${DIFF} seconds ago"
done
echo ""
et les erreurs:
/usr/local/nagios/libexec $ bash secs-since-modified.sh

secs-since-modified.sh: ligne 8: erreur de syntaxe près du symbole inattendu « $'do\r' »
'ecs-since-modified.sh: ligne 8: `do

je débute en programmation , j'ai essayé de chercher mais en vain.
dites-moi si la présentation du post est à améliorer.
merci à vous

salinois
Salinois
PCs: windows10, linux debian (differentes version)
Raspberry

Avatar du membre
alain
Administrateur du site
Messages : 14807
Enregistré le : dim. 11 oct. 2015 23:41
Localisation : Chelles
Contact :

Re: Script en bash

Message par alain »

Bonjour Salinois
salinois a écrit :
ven. 5 janv. 2024 20:43
secs-since-modified.sh: ligne 8: erreur de syntaxe près du symbole inattendu « $'do\r' »
'ecs-since-modified.sh: ligne 8: `do
je suis nul en script bash et en programmation en général.
Mais j'ai eu une fois ce problème en recopiant un script sur windows.
Le symbole inattendu est un retour chariot de windows et non un retour à la ligne de linux.
Ne me demande pas en quoi c'est différent, je n'en sais rien. Une recherche sur le web pourrait certainement nous le dire :l ;)
Bref la solution dans mon cas (merci Arghlub) à été de remplacer les retours chariot de windows par des retours linux:

Code : Tout sélectionner

sed -i 's/\r$//' ton_script.sh

ou plus précisément pour toi:

Code : Tout sélectionner

sed -i 's/\r$//' secs-since-modified.sh
PC are like air conditioning, they becomes useless when you open Windows (L.T)
PC1 : CM : ASRock 990FX | CPU: AMD FX 8350-8 cores, 4 GHz | RAM: 16 Go DDR3 1600 MHz | CG: ATI RX 580-8 Go | OS : LM 20.3 Uma Xfce 4.16 | K: 5.4
PC2
:Core2 Quad Q9650 @ 3 GHz | CG: Nvidia GTX 650TI | OS: LM 21.3 Xfce 4.18| K: 6.5
PC3 :Core i7-2600 @ 3,5 GHz | CG: ATI HD 4650 | OS: Emmade5 Xfce 4.18.0 | K: 6.1
PC4 : AMD Ryzen 5 3500X 4GHz | CG: GTX 970 | Ram : 8GB |OS : Debian 10.5 | K: 5.10
In a world without walls and fences, who needs windows and gates?

salinois
Messages : 35
Enregistré le : ven. 5 janv. 2024 16:55
Localisation : jura

Re: Script en bash

Message par salinois »

merci alain,
j'ai fais ça, effectivement bizarre;
bon maintenant , j'ai d'autres erreurs.

Code : Tout sélectionner

#!/bin/bash
#
# ref: https://stackoverflow.com/questions/19463334/how-to-get-time-since-file->
#
cd /var/lib/weewx
echo ""
for FILE in *.sdb
do
  DIFF="$(($(date +%s) - $(date -r"${FILE}"+%s)))"
  if [ ${DIFF} -gt 600 ]
  then
      echo -n "ERROR"
  else
      echo -n "OK   "
  fi
  echo "   ${FILE} was last modified ${DIFF} seconds ago"
done
echo ""
erreurs:bash secs-since-modified.sh
date: weewx.sdb+%s: Aucun fichier ou dossier de ce type
secs-since-modified.sh: ligne 9: 1704538488 - : erreur de syntaxe : opérande attendu (le symbole erroné est « -  »)

on dirait que la commande "cd /var/lib/weewx " ne passe pas !!!
salinois
Salinois
PCs: windows10, linux debian (differentes version)
Raspberry

Avatar du membre
cyrille
Administrateur du site
Messages : 12448
Enregistré le : mar. 19 sept. 2017 08:49
Localisation : Nowhere
Contact :

Re: Script en bash

Message par cyrille »

Bjr,
Suis les recommandations d'Alain dans un premier temps
Sinon je te conseille de bosser en parallèle avec

Pour bien comprendre tes lignes de commande
https://explainshell.com/

Pour tester ton script
https://www.shellcheck.net/

Faire aussi attention à l'usage des "" , '' dans le passage des variables ;)

Bon dev ;)
?séuqartéd sel ruoP / sécnoféd sel ruoP / sreiruréB sel ruoP / ?étéicos elleuQ

https://crust.ovh

salinois
Messages : 35
Enregistré le : ven. 5 janv. 2024 16:55
Localisation : jura

Re: Script en bash

Message par salinois »

bonjour cyril

c'est ce que j'ai fait, une erreur a disparu mais d'autres sont arrivées.
je vais regarder tes conseils.

patrick
Salinois
PCs: windows10, linux debian (differentes version)
Raspberry

Avatar du membre
cyrille
Administrateur du site
Messages : 12448
Enregistré le : mar. 19 sept. 2017 08:49
Localisation : Nowhere
Contact :

Re: Script en bash

Message par cyrille »

Bonjour
Si je comprends bien ton script
tu cherches à savoir la date de la dernière modification d'un fichier, c'est bien ça ? le gt 600 correspond à quoi (le 600) ?

Pour les erreurs nouvelles, il faut nous les copier si tu veux un coup de pouce ;)
?séuqartéd sel ruoP / sécnoféd sel ruoP / sreiruréB sel ruoP / ?étéicos elleuQ

https://crust.ovh

salinois
Messages : 35
Enregistré le : ven. 5 janv. 2024 16:55
Localisation : jura

Re: Script en bash

Message par salinois »

re,
pardon, je croyais les avoir mises, les voici

bash secs-since-modified.sh

date: weewx.sdb+%s: Aucun fichier ou dossier de ce type
secs-since-modified.sh: ligne 9: 1704552999 - : erreur de syntaxe : opérande attendu (le symbole erroné est « -  »)

pour le GT 600 , à vrai dire je sais pas trop ( c'est un ami américain qui m'a passé le script ) ; en gros c'est pour vérifier le fichier de la base de données, si celui se met bien à jour toutes les 5 mn.

voici la traduction de ce qu'il m'a mis en anglais, pour le script.
[Voici un script rapide pour imprimer les secondes depuis la dernière modification d'un fichier et se plaindre si cela dure plus de 10 minutes, à titre d'exemple.
FWIW - Je vérifierais que l'archive est en cours de modification et que le dernier skin de votre ordre typique se termine avec succès.
Cet exemple vérifie simplement que le(s) fichier(s) sdb sont en cours de mise à jour.]
j'espere être assez clair. dis le moi.


salinois
Modifié en dernier par salinois le sam. 6 janv. 2024 16:05, modifié 1 fois.
Salinois
PCs: windows10, linux debian (differentes version)
Raspberry

Avatar du membre
cyrille
Administrateur du site
Messages : 12448
Enregistré le : mar. 19 sept. 2017 08:49
Localisation : Nowhere
Contact :

Re: Script en bash

Message par cyrille »

tu cherches à savoir la date de la dernière modification d'un fichier, c'est bien ça ? le gt 600 correspond à quoi (le 600) ?
Tu ne réponds pas à cette question ;)

date: weewx.sdb+%s: Aucun fichier ou dossier de ce type
Il ne trouve pas de fichier nommé ici
Débugguer en faisant un echo et voir la valeur weewx.sdb+%s

Quand on fait une action sur un fichier, toujours penser à gérer l'erreur au cas où le fichier n'existe pas --> faire un test

secs-since-modified.sh: ligne 9: 1704552999 - : erreur de syntaxe : opérande attendu (le symbole erroné est « - »)
L'erreur est explicite, sans doute autour du symbole " - "

Remets nous en copie le script au fur et à mesure de ses modifications sinon on arrivera pas à suivre

(ou crée un git à jour et donne nous le lien)
?séuqartéd sel ruoP / sécnoféd sel ruoP / sreiruréB sel ruoP / ?étéicos elleuQ

https://crust.ovh

salinois
Messages : 35
Enregistré le : ven. 5 janv. 2024 16:55
Localisation : jura

Re: Script en bash

Message par salinois »

voila le scrip apres avoir effectué les modifs conseillées par Alain.

Code : Tout sélectionner

#!/bin/bash
#
# ref: https://stackoverflow.com/questions/19463334/how-to-get-time-since-file-was-last-modified-in-seconds-with-bash
#
cd /var/lib/weewx
echo ""
for FILE in *.sdb
do
  DIFF="$(($(date +%s) - $(date -r"${FILE}"+%s)))"
  if [ ${DIFF} -gt 600 ]
  then
      echo -n "ERROR"
  else
      echo -n "OK   "
  fi
  echo "   ${FILE} was last modified ${DIFF} seconds ago"
done
echo ""
Pour le gt 600 ( ce n'est pas moi qui fait le script, pas assez bon en programmation) , je pense que cela doit correspondre à 600 sec ( 10 mn)
la base de données se met à jour toutes les 5 mn.

salinois
Salinois
PCs: windows10, linux debian (differentes version)
Raspberry

Avatar du membre
cyrille
Administrateur du site
Messages : 12448
Enregistré le : mar. 19 sept. 2017 08:49
Localisation : Nowhere
Contact :

Re: Script en bash

Message par cyrille »

Donc le but

1/c'est d'aller dans /var/lib/weewx

2/ Il contient des fichiers avec extensions for *.sdb

3/ Tu récupères leur date d'accès et ne prends que si plus vieux que 10 minutes

C'est bien ça ?
?séuqartéd sel ruoP / sécnoféd sel ruoP / sreiruréB sel ruoP / ?étéicos elleuQ

https://crust.ovh

Répondre