Résolu Script bash pour port série

marsien

Grand Maître
Salut,

Ca fait longtemps que je n'était pas passé par ici (en gros depuis le changement présence-pc => tom's hardware :ange: ).

J'aurais besoin d'un petit coup de main pour un script sur Linux (Debian).

Le contexte : le PC avec Debian doit me servir à récupérer des infos envoyées depuis un appareil connecté via le port série. Pas de souci pour la connexion, stty fait très bien les choses :)

La où ça se complique, c'est au niveau des infos envoyées par l'appareil. En voici un extrait de quelques secondes :
[fixed]?1: NO COMMAND

?1: NO COMMAND

?1: NO COMMAND

?1: NO COMMAND

?1: NO COMMAND

TIME : 10:17

Condenser: -51.8 C

Pressure: 0.14 hPa

Product: *.* C



?1: NO COMMAND

?1: NO COMMAND

?1: NO COMMAND

?1: NO COMMAND

?1: NO COMMAND[/fixed]

L'enregistrement doit durer 24h environ pour chaque utilisation de l'appareil (temps d'un cycle complet). A ce rythme-là j'obtiens des fichiers de plus de 300 Mo :heink: Et ensuite c'est chaud pour faire de trie dedans, même de façon automatique !

J'ai donc penser supprimer "à la volée" tout ce qui ne me sert à rien, c'est à dire "?1: NO COMMAND" et les lignes vides. Dans ma grande ignorance de la beauté des scripts bash, j'ai essayé de faire simple :

[cpp](cat /dev/ttyS0 | grep -Eiv "^(\?1: NO COMMAND|)$") >> ./`date '+%Y%m%d-%H0000'`_lyoph.log[/cpp]

Et là c'est le drame, rien n'est inscrit dans mon fichier :( Mais si au lieu de rediriger vers un fichier je laisse l'affichage sur la sortie standard, ça marche ! Je ne vois pas comment m'en sortir...

Dernières petites remarques : sans grep, la redirection marche. J'ai essayé avec sed à la place de grep, mais c'est pas mieux. J'ai également essayé avec ou sans les parenthèses entourant les actions avant la redirection. Enfin, j'ai également essayé en redirigeant /dev/ttyS0 sur l'entrée standard plutôt que de le fournir en paramètre à cat. Mais ça ne change rien...

Avez-vous une idée de script qui me permette d'enregistrer dans un fichier ce qui provient du port série en enlevant au passage ce qui ne me sert pas ?

En vous remerciant par avance de votre aide :)
Bonne journée
 

zeb

Modérateur
:hello: marsien ! Ça faisait en un bout en effet.

Les parenthèses autour de ton cat|grep instancient un shell dont la sortie ne sera exploitée qu'à la fin.

Les parenthèses dans ton regex ne servent pas à grand chose.
(Pourqui le | à la fin de commande ?)

L'antique notation `...` est désuète. Utilise $( ... ) à la place. L'intérêt est esthétique et programmatique : on peut les imbriquer.

Ton fichier est horodaté, il n'existe donc pas encore. Pas la peine d'utiliser la commande >>, > devrait suffire.

Ça donne :
Code:
cat /dev/ttyS0 | grep -Eiv "^\?1: NO COMMAND$" > ./$( date '+%Y%m%d-%H0000' )_lyoph.log

Je n'ai ni Linux (AIX), ni bash (korn), ni de /dev/ttyS0 (ben non) pour vérifier mes dires. Dis-moi si c'était bien ça le soucis.

La bise à Mélissa.
zeb-de-ppc
 

marsien

Grand Maître
Salut Zeb,

J'ai mis des parenthèses dans le grep et un | pour lui demander de supprimer soit les lignes contenant le texte inutile, soit les lignes vides (d'où le | sans rien après... Mais même si ça marche, ça ne doit pas être très élégant comme méthode :) )

Je ne peux pas tester pour l'instant, l'appareil est en cours d'utilisation jusqu'à demain en milieu d'après-midi (cycle de 24h, c'est long ! Et ça va encore me faire un (très) gros fichier de log).
Je te tiens au courant demain soir, ou lundi, dès que j'aurai l'appareil libre pour tester.

Sinon, je pense que je vais garder les >> car le nom du fichier est défini seulement une fois, au début du script et contient tous les enregistrements pendant les 24h que dure le cycle. Est-ce que je me trompe ?
 

marsien

Grand Maître
PS : ça m'a fait bizarre (et plaisir) aussi de revoir Melissa ici :) (je ne l'utilise plus comme avatar maintenant ...)
 

batchy

Grand Maître
Meilleure réponse
À mon avis c'est pas ça le problème. Le truc c'est que grep ne flushe pas ses buffers de sortie. ton fichier se rempli quand même, mais (par exemple) il est écrit sur le disque que tout les 2ko. si tu coupe le processus en plein millieu, ça va pas écrire le reste ...

Pour ça, la seule solution imediate que je vois, c'est sed -u

Code:
sed -ru '/^(\?1: NO COMMAND)?$/d' /dev/ttyS0 > ./$( date '+%Y%m%d-%H0000' )_lyoph.log

(et un UUC en moins !)
 

marsien

Grand Maître
Merci Batchy

On en (ré)apprends tous les jours ! :) Je n'avait pas pensé à un problème de buffer de sortie pour l'une des commandes. Je teste tout ça demain soir ou lundi

Et merci pour l'économie si ça marche :D

En tout cas merci les gars, c'est sympa de m'aider.
 

marsien

Grand Maître
Salut,

Comme promis, je viens de tester ta ligne de commande Batchy (j'ai juste rajouté mon | dans la parenthèse de sed ; ben oui, j'y tiens, car ça me permets de virer toutes les lignes vides :) ). Bref, ben c'est nickel !

Un grand merci à tous les 2

Si vous savez comment je peux tuer cette commande à l'arrêt du PC, sans avoir besoin de faire un kill manuellement, je suis preneur :D Le PC est dédié à cette tâche n'a ni clavier, ni écran. Je le pilote par ssh pour le paramétrage, mais en routine les utilisateurs vont devoir s'en servir sans rien, et donc juste le démarrer et l'arrêter avec le bouton du boitier... Actuellement, si la commande est lancé au démarrage, l'arrêt est impossible tant qu'elle n'est pas tuée...
 

batchy

Grand Maître
Tu à peut être zappé le '?' que j'ai rajouté à la fin de la parenthèse qui fait ce que tu veux ;)

Je vois pas pourquoi cette tache ne pourrait pas être tuée ...
 

marsien

Grand Maître

Euh, si en fait :ange: Je vais donc enlever de suite mon | et approfondir ma connaissance des regex :D


Ben en fait moi non plus, faut juste que je mette la commande de kill dans les bons run level, non ? Soit 0 pour arrêt et 6 pour redémarrage
 

zeb

Modérateur
Quel besoin de killer (désolé) explicitement ton processus ?
S'il s'exécute en local, il sera tué par les scripts de niveau 0 et/ou 6 !
 
Vous devez vous inscrire ou vous connecter pour répondre ici.
Derniers messages publiés
Statistiques globales
Discussions
730 184
Messages
6 719 133
Membres
1 586 493
Dernier membre
mathmath2255
Partager cette page
Haut