J'ai un système qui traite les e-mails entrants pour les envoyer à une application boîte noire à mon travail. Le script de haut niveau est maintenu par inittab pour toujours s'exécuter et exécute un script enfant pour faire le travail réel avec cette commande :
$SCRIPT | nc -l -p $PORT
Le script lui-même lit à partir d'un tuyau nommé, effectue un peu d'analyse et de traitement des données avant de faire appel à echo
pour renvoyer les données via netcat au processus connecté sur $PORT.
Ce dont j'ai besoin, c'est d'une méthode pour gérer les données entrantes à l'extrémité de mon tuyau. Lorsque je fais une demande dans l'application pour fermer la connexion, elle renvoie une chaîne (je peux la définir comme je veux) et attend que mon script ferme le tuyau. J'ai actuellement du mal à comprendre comment je peux ajouter la fonctionnalité pour lire les données entrantes de l'autre extrémité ; vérifier qu'il s'agit de la commande de fermeture du tuyau, puis quitter le script.
Mon script (en résumé) ressemble à ceci :
while true ; do
email_input="`cat "$pipe"`"
if [[ $email_input =~ .*escape_queue.* ]] ; then
break;
fi
echo "`parse`"
done
Je suis ouvert à la possibilité de devoir modifier le déroulement du programme, mais je n'arrive pas à comprendre comment je pourrais lire les données entrantes de manière asynchrone puisque le script se bloque sur cat $pipe
jusqu'à ce qu'un nouvel e-mail soit reçu pour être traité.
Si ce n'est pas clair, je suis novice en matière de scripting bash et je suis toujours ouvert aux suggestions d'amélioration.
UPDATE J'ai changé mon appel script en
$SCRIPT | nc -l -p $PORT > $nc_data
et dans le script lui-même
netcat_response="`cat "$nc_data"`";
if [[ "$netcat_response" =~ "exit" ]] ; then
cat /dev/null > $nc_data
break;
fi
À ce stade, le script se termine dès qu'un nouveau message est acheminé dans le fifo. Cela signifie que je vais toujours perdre 1 message car il est lu par le script et ensuite le script se termine. Le script bloque toujours sur le fichier cat
jusqu'à ce que quelque chose soit lu. Dans le pire des cas, il faudra s'en contenter.