Script bash pour port série
Dernière réponse : dans Le monde de Linux
Salut,
Ca fait longtemps que je n'était pas passé par ici (en gros depuis le changement présence-pc => tom's hardware
).
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 :
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
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 :
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
Ca fait longtemps que je n'était pas passé par ici (en gros depuis le changement présence-pc => tom's hardware
).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 :
?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
?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
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
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 :
(cat /dev/ttyS0 | grep -Eiv "^(\?1: NO COMMAND|)$") >> ./`date '+%Y%m%d-%H0000'`_lyoph.log
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
Autres pages sur : script bash port serie
Lassé par la pub ? Créez un compte
Meilleure solution
À 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
(et un UUC en moins !)
Pour ça, la seule solution imediate que je vois, c'est sed -u
sed -ru '/^(\?1: NO COMMAND)?$/d' /dev/ttyS0 > ./$( date '+%Y%m%d-%H0000' )_lyoph.log
(et un UUC en moins !)
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 :
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
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 ?
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 ?
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
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...
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
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... marsien a dit :
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
).
marsien a dit :
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
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 a dit :
Tu à peut être zappé le '?' que j'ai rajouté à la fin de la parenthèse qui fait ce que tu veux
Euh, si en fait
Je vais donc enlever de suite mon | et approfondir ma connaissance des regex
batchy a dit :
Je vois pas pourquoi cette tache ne pourrait pas être tuée ...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
Lassé par la pub ? Créez un compte
- Contenus similaires :
- Forumscript bash et bc, recherche aide experte
- ForumScript BASH : Desactiver des comptes
- Forumparcours d'un fichier dans un script bash
- ForumDrivers GPS et port série
- ForumPlan de cablage porté série interne sur CM ASUS P5Q-E
- ForumRecherche de pc portables avec port série intégré
- ForumExpressCard54 avec un port série RS232
- ForumPb ajout carte PCI port série
- Forumcommunication entre deux par le port serie RS323
- Voir plus