Contenu | Rechercher | Menus

Annonce

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.

À propos de l'équipe du forum.

#1 Le 26/04/2010, à 10:45

Efhache84

script bash check d'un contenu spécifique dans fichier

Bonjour à tous et toutes,

Voici mon problème... je dispose d'un appareil qui doit émettre des données chaque heure par GPRS (Réseau GSM). Malheureusement, pour peu que l'opérateur fasse une manipulation (reset de carte, changement de config opérateur préféré...) il est nécessaire de réaliser le reboot du modem...

Pour ce faire j'ai donc un petit patch hardware qui me permet de faire ce reset, et pour le commander j'utiliser un état logique en sortie du petit ARM... (dans les grandes lignes, c'est un peu plus complexe que ça, mais pas utile pour ce que je cherche)

Cet ensemble là fonctionne. Je peux demander en ligne de commande le reset, cela se fati. Je peux automatiser le reset par une tâche cron et ça fonctionne (en gros j'appelle un petit soft avec le paramètre adéquat)

Mais j'aimerais rendre cela un peu plus malin...

Donc, sachant qu'il existe un fichier qui log les erreurs lors des tentatives de connexions, j'aimerais (par l'intermédiaire d'un script) pouvoir :

1) vérifier si le fichier a été modifié endéans les 60 dernières minutes (en gros est-ce que sur les 60 dernières minutes il y a eu des soucis de connexions?)

2) vérifier la présence d'un mot (parmis une liste possible) dans ce fichier de log.

3) vérifier qu'un délai de 30 minutes s'est écoulés au minimum depuis l'heure  (soit qu'on est plus tard que 00h30, 01h30.... 08h30... 21h30... 23h30)


Dans le cas où c'est 3 conditions sont remplies, il faut que le reset du modem soit exécuté...


Comment faire cela en script bash???  (pour des raisons historique c'est en script bash que cela doit se faire...)


Aspire 5633 WLMi - Lucid Lynx 10.04 en 64 bits

Hors ligne

#2 Le 26/04/2010, à 11:06

iuchiban

Re : script bash check d'un contenu spécifique dans fichier

salut,

alors dans l'ordre :
1) la commande stat te renvoie divers informations. En utilisant le format %Y tu as le nombre de secondes écoulées depuis le 1er janvier 1970 (format epoch) jusqu'à la dernière modification du fichier.
Avec date +%s tu as l'heure actuelles en secondes écoulées.
Si la différence de date +%s et stat --format=%Y <Fichier> est supérieure ou égale à 3600, alors le fichier a été modifié il y a moins d'une heure

2) grep <Mot> <Fichier>
renvoie 0 si le Mot est présent

3) La encore la fonction date avec le bon format : date +%M te donne les minutes.
En grepant si le premier chiffre est 3, 4 ou 5, c'est bon

En gros :

[[ $(($(date +%s) - $(stat --format=%Y Env.cfg))) -gt 3600 ]] && [[ $(grep <Mot> <Fichier>) ]] && [[ $(date +%M | grep "[3-5][0-9]") ]] && LANCER_LE_REBOOT

C'est depuis que Chuck Norris a laissé la vie sauve à un manchot que l'on dit que Linux est libre.

Chuck Norris n'a pas besoin d'éditer son premier message pour ajouter [Résolu]. Chuck Norris est toujours [Résolu], quoi qu'il arrive.

Hors ligne

#3 Le 26/04/2010, à 11:19

Efhache84

Re : script bash check d'un contenu spécifique dans fichier

ok merci pour l'info.

J'ai testé (partiellement) et j'obtiens que mon mot de recherche est un operand inconnu... hmm

root@embpc1:/etc/ppp [[ $(grep Failed connect-errors) ]] && /powershaver/modemreset
sh: Failed: unknown operand

par contre si je cherche sur un mot qui ne se trouve pas dans le fichier je n'ai aucune erreur et le modemreset ne se fait pas (comportement tel que attendu)

J'avoue ne pas être fort doué avec le bash (mais je me documente) donc peut-être y a-t-il bêvue de ma part


Aspire 5633 WLMi - Lucid Lynx 10.04 en 64 bits

Hors ligne

#4 Le 26/04/2010, à 11:48

credenhill

Re : script bash check d'un contenu spécifique dans fichier

hello
essaye

grep -q "texte message" nom_du_fichier && echo trouvé

Hors ligne

#5 Le 26/04/2010, à 13:00

iuchiban

Re : script bash check d'un contenu spécifique dans fichier

Essaye en rajoutant des " " autour de Failed;

Mais je viens de faire le test suivant :

cat fichier.txt
toto
test
Failed
oki
fin

[[ $(grep Failed fichier.txt) ]] && echo "y'a failed"
y'a failed

"Edition et suppression de la ligne Failed"
[[ $(grep Failed Alban.txt) ]] && echo "y'a failed"
      <= rien

C'est depuis que Chuck Norris a laissé la vie sauve à un manchot que l'on dit que Linux est libre.

Chuck Norris n'a pas besoin d'éditer son premier message pour ajouter [Résolu]. Chuck Norris est toujours [Résolu], quoi qu'il arrive.

Hors ligne

#6 Le 26/04/2010, à 13:27

credenhill

Re : script bash check d'un contenu spécifique dans fichier

avec grep -q ça ne fonctionne pas

$ [[ $(grep Failed fichier.txt) ]] && echo "y'a failed"
y'a failed
$ 
$ [[ $(grep -q Failed fichier.txt) ]] && echo "y'a failed"
$  # sans les [[ ]]
$ grep -q Failed fichier.txt && echo "y'a failed"
y'a failed

Hors ligne

#7 Le 26/04/2010, à 13:43

iuchiban

Re : script bash check d'un contenu spécifique dans fichier

je viens de faire le test suivant (utilisdation du /etc/hosts car le fichier.txt vient d'être modifié big_smile):

$> [[ $(($(date +%s) - $(stat --format=%Y /etc/hosts))) -gt 600 ]] && [[ $(grep Failed fichier.txt) ]] && [[ $(date +%M | grep "[3-5][0-9]") ]] && echo "tout est bon"
tout est bon

Donc pas besoin du -q pour le grep normalement.


Efhache84 a écrit :

ok merci pour l'info.

J'ai testé (partiellement) et j'obtiens que mon mot de recherche est un operand inconnu... hmm

root@embpc1:/etc/ppp [[ $(grep Failed connect-errors) ]] && /powershaver/modemreset
sh: Failed: unknown operand

par contre si je cherche sur un mot qui ne se trouve pas dans le fichier je n'ai aucune erreur et le modemreset ne se fait pas (comportement tel que attendu)

J'avoue ne pas être fort doué avec le bash (mais je me documente) donc peut-être y a-t-il bêvue de ma part

Es tu sûr de tes commandes passées ??

Peux tu nous poster une partie du fichier connect-errors ??

Dernière modification par iuchiban (Le 26/04/2010, à 13:44)


C'est depuis que Chuck Norris a laissé la vie sauve à un manchot que l'on dit que Linux est libre.

Chuck Norris n'a pas besoin d'éditer son premier message pour ajouter [Résolu]. Chuck Norris est toujours [Résolu], quoi qu'il arrive.

Hors ligne

#8 Le 26/04/2010, à 13:48

Efhache84

Re : script bash check d'un contenu spécifique dans fichier

les commandes passées oui... dans le sens ou je copie/colle c'est bel et bien ce que j'ai posté...

pour le fichier connect errors :

Mon Apr 26 12:02:01 CEST 2010
stop
Mon Apr 26 12:07:01 CEST 2010
start
timeout set to 5 seconds
abort on (\nBUSY\r)
abort on (\nNO ANSWER\r)
abort on (\nNO CARRIER\r)
abort on (\nNO DIALTONE\r)
abort on (\nRINGING\r\n\r\nRINGING\r)
timeout set to 12 seconds
send (^MAT^M)
expect (OK)
``^@AT
``^@AT^M^M
OKOK
-- got it

send (AT&D2^M)
expect (OK)

^M
AT&D2
AT&D2^M^M
OKOK
-- got it

send (AT+GSN^M)
expect (OK)

^M
AT+GSN
AT+GSN^M^M
+GSN: "354879023539496"
+GSN: "354879023539496"^M

^M
OKOK
-- got it

send (AT+CPIN?^M)

What's the signal quality?
expect (OK)

^M
AT+CPIN?
AT+CPIN?^M^M
+CPIN: READY
+CPIN: READY^M

^M
OKOK
-- got it

send (AT+CSQ^M)
expect (OK)

^M
AT+CSQ
AT+CSQ^M^M
+CSQ: 28,99
+CSQ: 28,99^M

^M
OKOK
-- got it

send (AT+GSN^M)
expect (OK)

^M
AT+GSN
AT+GSN^M^M
+GSN: "354879023539496"
+GSN: "354879023539496"^M

^M
OKOK
-- got it

send (AT+CPIN="****"^M)
send (ATE1^M)
expect (OK)

^M
AT+CPIN="3263"
AT+CPIN="3263"^M^M
ERROR
ERROR^M
ATE1
ATE1^M^M
OKOK
-- got it

send (AT+CPIN=?^M)
expect (OK)

^M
AT+CPIN=?
AT+CPIN=?^M^M
OKOK
-- got it

send (AT+CGDCONT=1,"IP","matma.1K.be","0.0.0.0",0,0^M)
version hardware modem
expect (OK)

^M
AT+CGDCONT=1,"IP","matma.1K.be","0.0.0.0",0,0
AT+CGDCONT=1,"IP","matma.1K.be","0.0.0.0",0,0^M^M
OKOK
-- got it

send (ATI9^M)
version software modem
expect (OK)

^M
ATI9
ATI9^M^M
GCEG24xNE0E1095
GCEG24xNE0E1095^M

^M
OKOK
-- got it

send (ATI8^M)
expect (OK)

^M
ATI8
ATI8^M^M
G24_G_0C.11.B6R
G24_G_0C.11.B6R^M

^M
OKOK
-- got it

send (ATD*99***1#^M)
timeout set to 30 seconds

waiting for connect...
expect (CONNECT)

^M
ATD*99***1#
ATD*99***1#^M^M
CONNECTCONNECT
-- got it

send (^M)

Connected.
If the following ppp negotiations fail,
try restarting the phone.

Mon Apr 26 14:06:08 CEST 2010
start
timeout set to 5 seconds
abort on (\nBUSY\r)
abort on (\nNO ANSWER\r)
abort on (\nNO CARRIER\r)
abort on (\nNO DIALTONE\r)
abort on (\nRINGING\r\n\r\nRINGING\r)
timeout set to 12 seconds
send (^MAT^M)
expect (OK)
``^@AT
``^@AT^M^M
OKOK
-- got it

send (AT&D2^M)
expect (OK)

^M
AT&D2
AT&D2^M^M
OKOK
-- got it

send (AT+GSN^M)
expect (OK)

^M
AT+GSN
AT+GSN^M^M
+GSN: "354879023539496"
+GSN: "354879023539496"^M

^M
OKOK
-- got it

send (AT+CPIN?^M)

What's the signal quality?
expect (OK)

^M
AT+CPIN?
AT+CPIN?^M^M
+CPIN: READY
+CPIN: READY^M

^M
OKOK
-- got it

send (AT+CSQ^M)
expect (OK)

^M
AT+CSQ
AT+CSQ^M^M
+CSQ: 17,99
+CSQ: 17,99^M

^M
OKOK
-- got it

send (AT+GSN^M)
expect (OK)

^M
AT+GSN
AT+GSN^M^M
+GSN: "354879023539496"
+GSN: "354879023539496"^M

^M
OKOK
-- got it

send (AT+CPIN="****"^M)
send (ATE1^M)
expect (OK)

^M
AT+CPIN="3263"
AT+CPIN="3263"^M^M
ERROR
ERROR^M
ATE1
ATE1^M^M
OKOK
-- got it

send (AT+CPIN=?^M)
expect (OK)

^M
AT+CPIN=?
AT+CPIN=?^M^M
OKOK
-- got it

send (AT+CGDCONT=1,"IP","matma.1K.be","0.0.0.0",0,0^M)
version hardware modem
expect (OK)

^M
AT+CGDCONT=1,"IP","matma.1K.be","0.0.0.0",0,0
AT+CGDCONT=1,"IP","matma.1K.be","0.0.0.0",0,0^M^M
OKOK
-- got it

send (ATI9^M)
version software modem
expect (OK)

^M
ATI9
ATI9^M^M
GCEG24xNE0E1095
GCEG24xNE0E1095^M

^M
OKOK
-- got it

send (ATI8^M)
expect (OK)

^M
ATI8
ATI8^M^M
G24_G_0C.11.B6R
G24_G_0C.11.B6R^M

^M
OKOK
-- got it

send (ATD*99***1#^M)
timeout set to 30 seconds

waiting for connect...
expect (CONNECT)

^M
ATD*99***1#
ATD*99***1#^M^M
CONNECTCONNECT
-- got it

send (^M)

Connected.
If the following ppp negotiations fail,
try restarting the phone.

Mon Apr 26 14:09:46 CEST 2010
start
timeout set to 5 seconds
abort on (\nBUSY\r)
abort on (\nNO ANSWER\r)
abort on (\nNO CARRIER\r)
abort on (\nNO DIALTONE\r)
abort on (\nRINGING\r\n\r\nRINGING\r)
timeout set to 12 seconds
send (^MAT^M)
expect (OK)
``^@AT
``^@AT^M^M
OKOK
-- got it

send (AT&D2^M)
expect (OK)

^M
AT&D2
AT&D2^M^M
OKOK
-- got it

send (AT+GSN^M)
expect (OK)

^M
AT+GSN
AT+GSN^M^M
+GSN: "354879023539496"
+GSN: "354879023539496"^M

^M
OKOK
-- got it

send (AT+CPIN?^M)

What's the signal quality?
expect (OK)

^M
AT+CPIN?
AT+CPIN?^M^M
+CPIN: READY
+CPIN: READY^M

^M
OKOK
-- got it

send (AT+CSQ^M)
expect (OK)

^M
AT+CSQ
AT+CSQ^M^M
+CSQ: 16,99
+CSQ: 16,99^M

^M
OKOK
-- got it

send (AT+GSN^M)
expect (OK)

^M
AT+GSN
AT+GSN^M^M
+GSN: "354879023539496"
+GSN: "354879023539496"^M

^M
OKOK
-- got it

send (AT+CPIN="****"^M)
send (ATE1^M)
expect (OK)

^M
AT+CPIN="3263"
AT+CPIN="3263"^M^M
ERROR
ERROR^M
ATE1
ATE1^M^M
OKOK
-- got it

send (AT+CPIN=?^M)
expect (OK)

^M
AT+CPIN=?
AT+CPIN=?^M^M
OKOK
-- got it

send (AT+CGDCONT=1,"IP","matma.1K.be","0.0.0.0",0,0^M)
version hardware modem
expect (OK)

^M
AT+CGDCONT=1,"IP","matma.1K.be","0.0.0.0",0,0
AT+CGDCONT=1,"IP","matma.1K.be","0.0.0.0",0,0^M^M
OKOK
-- got it

send (ATI9^M)
version software modem
expect (OK)

^M
ATI9
ATI9^M^M
GCEG24xNE0E1095
GCEG24xNE0E1095^M

^M
OKOK
-- got it

send (ATI8^M)
expect (OK)

^M
ATI8
ATI8^M^M
G24_G_0C.11.B6R
G24_G_0C.11.B6R^M

^M
OKOK
-- got it

send (ATD*99***1#^M)
timeout set to 30 seconds

waiting for connect...
expect (CONNECT)

^M
ATD*99***1#
ATD*99***1#^M^M
CONNECTCONNECT
-- got it

send (^M)

Connected.
If the following ppp negotiations fail,
try restarting the phone.

Dernière modification par Efhache84 (Le 26/04/2010, à 13:50)


Aspire 5633 WLMi - Lucid Lynx 10.04 en 64 bits

Hors ligne

#9 Le 26/04/2010, à 13:58

Efhache84

Re : script bash check d'un contenu spécifique dans fichier

et juste une bête question, pour transformer cette ligne de commandes transmises, en un fichier bash, est-ce que ceci est correct :

#!/bin/sh
#
#   Script to test the errors on modem connection
#
#   check if connect-errors file is modified under 60 minutes,if "Failed" word is present and if the time is more than half hour.
#	
#
if [ ($(date +%s) - $(stat --format =%Y /etc/ppp/connect-errors)) -gt 3600]
then 
	echo "Connect-errors file modified under 60 minutes"
	
	if [ $(grep "Failed" /etc/ppp/connect-errors) ]
	then
		echo "file contents Failed"
		
		if [ $(date +%M | grep "[3-5][0-9]") ]]
		then
			echo "we are after xx:30, so we can reset modem"
			/powershaver/modemtest -r 
		
		else
			echo "wait for end of gprsexport"
		fi
		
	else
		echo "no errors on connection"
	fi
else
	echo "no problem under last 60 minutes"
fi

Aspire 5633 WLMi - Lucid Lynx 10.04 en 64 bits

Hors ligne

#10 Le 26/04/2010, à 14:07

iuchiban

Re : script bash check d'un contenu spécifique dans fichier

ouep en gros c'est une bonne transformation.
Moi, j'utiliserais des double crochet pour le test, mais normalement ce script devrait fonctionner.

Au fait, attention a ton test de date, il faut $(( au début (ca permet de faire le calcul) et à avoir un espace après le 3600, sinon le test passera pas.


C'est depuis que Chuck Norris a laissé la vie sauve à un manchot que l'on dit que Linux est libre.

Chuck Norris n'a pas besoin d'éditer son premier message pour ajouter [Résolu]. Chuck Norris est toujours [Résolu], quoi qu'il arrive.

Hors ligne

#11 Le 26/04/2010, à 14:09

Efhache84

Re : script bash check d'un contenu spécifique dans fichier

oui il me l'a signalé... bon par contre... chose peu amusante la commande stat n'existe pas sur le système avec le linux... une autre piste??

Si la différence de date +%s et stat --format=%Y <Fichier> est supérieure ou égale à 3600, alors le fichier a été modifié il y a moins d'une heure

Ne serait-ce pas l'inverse?  si la différence est <3600 donc le fichier a été modifié il y a max une heure... (par exemple il y a 30 minutes et/ou il y a 10 secondes)

Autre question, que fait -gt ??? je ne trouve pas de référence à ça sur les man et sur google, (en même temps je cherche probablement un peu trop large en cherchant sur "-gt" )

Dernière modification par Efhache84 (Le 26/04/2010, à 14:11)


Aspire 5633 WLMi - Lucid Lynx 10.04 en 64 bits

Hors ligne

#12 Le 26/04/2010, à 15:12

credenhill

Re : script bash check d'un contenu spécifique dans fichier

Efhache84 a écrit :

Autre question, que fait -gt ??? je ne trouve pas de référence à ça sur les man et sur google, (en même temps je cherche probablement un peu trop large en cherchant sur "-gt")

man test ou man bash -> commandes internes -> test
ps:dans google, commencer un mot par - signifie l'exclure de la recherche

Hors ligne

#13 Le 26/04/2010, à 15:26

iuchiban

Re : script bash check d'un contenu spécifique dans fichier

je t'aide : http://abs.traduc.org/abs-fr/
http://abs.traduc.org/abs-fr/ch07s03.html

par contre si tu as pas stat, ca va être plus dûr.
Par contre oui, j'avais lu le problème à l'envers pour la vérification de la date de changement, c'est bien < 3600 et donc l'option -lt à utiliser.

C'est quoi ton linux ??


C'est depuis que Chuck Norris a laissé la vie sauve à un manchot que l'on dit que Linux est libre.

Chuck Norris n'a pas besoin d'éditer son premier message pour ajouter [Résolu]. Chuck Norris est toujours [Résolu], quoi qu'il arrive.

Hors ligne

#14 Le 26/04/2010, à 15:32

iuchiban

Re : script bash check d'un contenu spécifique dans fichier

Sinon j'ai trouvé ça sur un autre forum :

date -r <Fichier> +%s

et effectivement :

> ls -l fichier .txt
-rw-r--r-- 1 USER GROUP 5112 avril 26 14:50 fichier.txt
> date -r fichier.txt
lundi 26 avril 2010, 14:50:32 (UTC+0200)
> date -r fichier.txt +%s
1272286232

C'est depuis que Chuck Norris a laissé la vie sauve à un manchot que l'on dit que Linux est libre.

Chuck Norris n'a pas besoin d'éditer son premier message pour ajouter [Résolu]. Chuck Norris est toujours [Résolu], quoi qu'il arrive.

Hors ligne

#15 Le 26/04/2010, à 15:37

credenhill

Re : script bash check d'un contenu spécifique dans fichier

ou utiliser perl

$ date +%s; touch /tmp/a ; perl -e ' printf "%d\n" ,(stat($ARGV[0]))[9]' /tmp/a
1272292366
1272292366
$

Hors ligne

#16 Le 27/04/2010, à 11:42

Efhache84

Re : script bash check d'un contenu spécifique dans fichier

ok avec date -r cela fonctionne...   j'utilise busybox... mais il vient d'être recompillé avec stat (au cas où...)

Par contre dans la partie

if [ $(grep "Failed" /etc/ppp/connect-errors) ]

j'aimerais que ça ne prenne en compte que les x dernières lignes de ce fichier...

dans le man de grep je ne vois pas cette possibilité, mais éventuellement tail -n peut-il m'aider?


Aspire 5633 WLMi - Lucid Lynx 10.04 en 64 bits

Hors ligne

#17 Le 27/04/2010, à 11:47

credenhill

Re : script bash check d'un contenu spécifique dans fichier

if [ $(tail -x /etc/ppp/connect-errors | grep "Failed" ) ]

Hors ligne

#18 Le 28/04/2010, à 06:03

nesthib

Re : script bash check d'un contenu spécifique dans fichier

je n'ai pas lu le fil en détail mais pour surveiller un fichier sans cron (de façon passive) tu peux jeter un œil à inotify[wait|watch] qui surveille les appels système à un [fichier|dossier]


GUL Bordeaux : GirollServices libres : TdCT.org
Hide in your shell, scripts & astuces :  applications dans un tunnelsmart wgettrouver des pdfinstall. auto de paquetssauvegarde auto♥ awk
  ⃛ɹǝsn xnuᴉꞁ uʍop-ǝpᴉsdn

Hors ligne