3 votes

Existe-t-il un moyen simple et robuste de créer un processus "singleton" dans Bash ?

Environnement : Ubuntu récent, les paquets non standard sont OK tant qu'ils ne sont pas trop exotiques.

J'ai un processeur de données bash script qui traite les données de stdin :

$ cat data | process_stdin.sh

Je peux changer le script.

J'ai un ancien système de production de données (que je ne peux pas modifier) qui se connecte à une machine via SSH et appelle le script, en lui envoyant des données. Pseudocode :

foo@producer $ cat data | ssh foo@processor ./process_stdin.sh

Lancement de l'ancien système ./process_stdin.sh un million de fois par jour.

Je voudrais garder ./process_stdin.sh fonctionnant indéfiniment à processor pour se débarrasser de la surcharge de lancement de processus. Le producteur hérité appellera une sorte de wrapper qui acheminera d'une manière ou d'une autre les données vers le processus réel du processeur.

Existe-t-il un moyen robuste sous Unix pour faire ce que je veux avec un minimum de code ? Je ne veux pas modifier ./process_stdin.sh (beaucoup) - la réécriture complète est déjà prévue, mais, hélas, pas assez tôt - et je ne peux pas changer de producteur de données.

4voto

gniourf_gniourf Points 9393

Un hack (pas si) sale pourrait être le suivant :

Comme foo sur processor créer un fifo et lancer un tail -f redirigé vers stdin de process_stdin.sh , éventuellement dans une boucle infinie :

foo@processor:~$ mkfifo process_fifo
foo@processor:~$ while true; do tail -f process_fifo | process_stdin.sh; done

Ne vous inquiétez pas, à ce stade process_stdin.sh est juste en train d'attendre que des trucs arrivent sur le fifo. process_fifo . La boucle infinie est juste là au cas où quelque chose d'anormal se produirait, afin qu'elle soit relancée.

Vous pouvez alors envoyer vos données ainsi :

foo@producer:~$ cat data | ssh foo@processor "cat > process_fifo"

J'espère que cela vous donnera quelques idées !

1voto

Christophe Morio Points 336

Flocage faire le travail.

La même commande demandée 3 fois prochainement, mais en attendant que la serrure soit libre.

# flock /var/run/mylock -c 'sleep 5 && date' &
[1] 21623
# flock /var/run/mylock -c 'sleep 5 && date' &
[2] 21626
# flock /var/run/mylock -c 'sleep 5 && date' &
[3] 21627
# Fri Jan  6 12:09:14 UTC 2017
Fri Jan  6 12:09:19 UTC 2017
Fri Jan  6 12:09:24 UTC 2017

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X