[Date Prev][Date Next] [Thread Prev][Thread Next] [Date Index] [Thread Index]

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: