Re: sync sur un seul fichier
Le 25/01/16 à 18:11, Daniel Caillibaud <ml@lairdutemps.org> a écrit :
DC> Faudrait que j'essaie en exportant une fct d'écriture (dans mon fichier $RAPPORT) depuis le
DC> script principal vers le sous-shell…
ça change rien
DC> Sinon, y'a peut-être une autre solution en utilisant par un descripteur de fichier en
DC> lecture (écrire dedans plutôt que dans $RAPPORT) ou alors en utilisant un signal pour
DC> signifier au shell parent que l'on a écrit qqchose dans $RAPPORT, mais il faudrait alors
DC> fermer le descripteur qui capture sdtout pour lire le contenu, on tourne en rond (et ça
DC> devient une usine à gaz).
DC>
DC> Moralité, la solution que tu mentionnes est probablement la plus simple, quitte à faire
DC> des fcts main1, main2…
Sauf que si je veux séparer stdout et stdErr vers des pipes différents je sais pas faire sans
sous-shell.
Et le sous-shell qui se ferme ne suffit pas à garantir que le contenu du fichier est vu
correctement par le shell parent, faut aussi "attendre un peu".
Exemple, un fichier test.sh
#!/bin/bash
LOGERR=err
LOGSTD=out
>$LOGERR
>$LOGSTD
myPid=$$
errors=no
function fin() {
[ -s $LOGSTD ] && echo plein || echo vide
[ $(wc -l < $LOGSTD) -gt 0 ] && echo plein || echo vide
[ "$errors" == "yes" ] && echo "erreurs détectées" || echo "pas d'erreur détectée"
}
trap "errors=yes" RTMIN
trap fin EXIT
exec > >(while read line; do echo "[$(date '+%F %T')] $line" >> $LOGSTD; done)
exec 2> >(kill -RTMIN $myPid; while read line; do echo "[$(date '+%F %T')] ERROR : $line"|tee
-a $LOGERR >> $LOGSTD; done)
echo erreur >&2
fin
echo "sortie"
en le lançant et regardant le fichier juste après, ça donne :
./test.sh; cat out; sleep 0.2; echo; cat out
[2016-01-26 19:26:24] vide
[2016-01-26 19:26:24] ERROR : erreur
[2016-01-26 19:26:24] vide
[2016-01-26 19:26:24] vide
[2016-01-26 19:26:24] ERROR : erreur
[2016-01-26 19:26:24] vide
[2016-01-26 19:26:24] erreurs détectées
[2016-01-26 19:26:24] sortie
[2016-01-26 19:26:24] plein
[2016-01-26 19:26:24] plein
[2016-01-26 19:26:24] erreurs détectées
Mais si je met le kill après l'écriture dans le sous-shell avec
exec 2> >(while read line; do echo "[$(date '+%F %T')] ERROR : $line"|tee -a $LOGERR >>
$LOGSTD; done; kill -RTMIN $myPid;)
ça donne
./test.sh: ligne 22 : kill: (23702) - Aucun processus de ce type
[2016-01-26 19:30:46] vide
[2016-01-26 19:30:46] ERROR : erreur
[2016-01-26 19:30:46] vide
[2016-01-26 19:30:46] vide
[2016-01-26 19:30:46] ERROR : erreur
[2016-01-26 19:30:46] vide
[2016-01-26 19:30:46] pas d'erreur détectée
[2016-01-26 19:30:46] sortie
[2016-01-26 19:30:46] plein
[2016-01-26 19:30:46] plein
[2016-01-26 19:30:46] pas d'erreur détectée
bizarre non ? Le processus principal est déjà fini (plus de pid) alors que le kill du sous-shell
n'a pas terminé…
Je vais arrêter là et garder mon sleep…
--
Daniel
Bien sûr l'Amérique avait été découverte avant Colomb.
Mais le secret avait été bien gardé.
Oscar Wilde
Reply to: