Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

script bash substitution email subject

1 réponse
Avatar
Christophe PEREZ
Bonjour,

Je poste ici au cas o͹ ce soit la base de ma démarche et de mon
raisonnement qui soit défaillant, sinon, ça ne serait pas spécifique Í 
Linux mais pourrait aller sur fcou (mais je ne sais pas du tout gérer
le cross-post avec claws-mail).

J'en ai marre de recevoir des mails de t͢che cron dont le sujet est le
nom de la commande exécutée. Pour peu que la commande soit un peu
longue, avec pipes et autres, c'est illisible.

Après quelques recherches, j'ai cru comprendre qu'aucun mécanisme
intégré Í  cronie (ce que j'utilise sur mes gentoo) ne puisse
solutionner mon problème, et que la solution soit de faire une sorte de
wrapper auquel soit envoyé le résultat de la commande afin que ce soit
lui qui envoie le mail au bon sujet.

J'ai donc voulu faire ce script de quelques lignes, mais je ne parviens
pas Í  trouver le moyen de répondre Í  toutes les conditions :
- passer le titre du mail en paramètre (facile)
- si aucune sortie de la commande, pas de mail envoyé
- quelque soit le type de sortie de la commande, et surtout quelque
soit le temps qu'elle met Í  être produite, elle est transmise par mail
(avec rsync par exemple, je n'y parviens pas)

La ligne de crontab contiendrait "ma_commande | mon_script.sh"

J'avais essayé de faire :
INPUT=($cat -)
C'était simple, j'avais tout le contenu de la sortie de la commande
dans l'entrée de mon script, mais, s'il n'y a pas d'entrée, il attend
indéfiniment.
J'ai donc du me résoudre, Í  contrec½ur, Í  utiliser :
INPUT=
while read -t 0.1 line; do
INPUT="$line\n"
done
afin d'avoir le timeout, mais lÍ , si la commande met du temps Í 
s'exécuter, cela dépasse le timeout, et si j'augmente ce dernier, il
faudrait l'augmenter de façon considérable pour prendre en compte un
maximum de cas, et ça ferait que les commandes sans sortie serait
longtemps bloquées par ce timeout.

J'imagine que c'est un cas d'école, que peut-être certains ici ont déjÍ 
résolu pour leurs besoins.

Merci d'avance.

Pour info, en préambule du script, j'ai :
[ -n "$1" ] && SUBJECT="$1" || SUBJECT="No subject"

Et Í  la fin :
[ -n "$INPUT" ] && echo "$INPUT" | mail -s "$SUBJECT" $USER

1 réponse

Avatar
Christophe PEREZ
Le Wed, 31 Aug 2022 16:29:24 -0400,
Christophe PEREZ a écrit :
J'imagine que c'est un cas d'école, que peut-être certains ici ont
déjÍ  résolu pour leurs besoins.

Et bien je m'attendais Í  un peu plus d’enthousiasme ;)
Au final, je n'ai rien trouvé de mieux que de passer par un outils
annexe (ifne du package moreutils) (*) et mon script bash devient :
#!/bin/bash
[ -n "$1" ] && SUBJECT="$1" || SUBJECT="No subject"
INPUT=$(ifne cat -)
[ -n "$INPUT" ] && echo "$INPUT" | mail -s "$SUBJECT" $USER
Si quelqu'un a un commentaire Í  faire, je reste toujours preneur et
curieux.
(*) plus exactement, j'ai récupéré un source de quelques lignes, Í 
compiler, qui fait le job comme ifne, et que j'ai packagé pour gentoo,
et qui s'utilise comme ifne :
https://unix.stackexchange.com/a/498065/374007
Source fionread.c :
#include <unistd.h>
#include <poll.h>
#include <sys/ioctl.h>
#ifdef __sun
#include <sys/filio.h>
#endif
#include <err.h>
int main(int ac, char **av){
int r; struct pollfd pd = { 0, POLLIN };
if(poll(&pd, 1, -1) < 0) err(1, "poll");
if(ioctl(0, FIONREAD, &r)) err(1, "ioctl(FIONREAD)");
if(r < 1) return 1;
if(++av, --ac < 1) return 0;
execvp(*av, av);
err(1, "execvp %s", *av);
}