2009-08-16 4 views
1

J'ai un serveur distant Music Player Daemon (MPD) fonctionnant sur une machine Linux. J'ai un client qui écoute ce flux sur une autre machine Linux.Meilleure façon de surveiller un serveur sur un port TCP

Lorsque le serveur MPD est invité à mettre en pause ou à arrêter le flux, il déconnecte tous les clients connectés sur le port TCP. Par conséquent, lorsque le serveur redémarre, les clients doivent être reconnectés manuellement.

Je veux écrire un programme qui surveillera le port TCP pour un serveur acceptant des connexions, puis redémarrer automatiquement les clients. Puis-je faire mieux que d'exécuter connect() et sleep() dans une boucle? Existe-t-il des utilitaires de ligne de commande pour cela?

Je peux exécuter le client sur la machine qui exécute le serveur MPD, si cela peut aider. Ce qui suit me dira si un processus écoute sur un port local, mais ils ne bloquent pas si un processus ne l'est pas, donc je dois toujours les enrouler en boucle.

$ sudo fixeur tcp -n 8000
8000/tcp: 9677

$ sudo netstat -nlp | grep 8000
tcp 0 0 0.0.0.0:8000 0.0.0.0:* LISTEN 9677/mpd

Je peux essayer toute solution qui ne nécessite pas de modifier le comportement du serveur RPD.

Répondre

3

Il y a toujours la possibilité d'écrire un serveur relais proxy pour MPD.

Il se trouve là en écoutant sur un port différent pour vos clients et établit des connexions au MPD à leur place. Lorsque le MPD se déconnecte, le relais tente simplement de se reconnecter toutes les quelques secondes sans déconnecter ses clients.

2

vous allez ici:

echo -n "" | nc -q 0 localhost 8000 && echo "made a connection" || echo "server was down" 

echo -n "" met un EOF immédiatement stdin; nc -q 0 retourne immédiatement après avoir vu que EOF sur stdin. nc (netcat) essaie de se connecter à localhost sur le port 8000. S'il se connecte avec succès, il renvoie un code d'erreur réussi et nous faisons écho à "fait une connexion"; sinon, si la connexion a été refusée, nous nous sommes fait l'écho de "server was down".

Si vous voulez le tester, puis dans une autre course terminale

nc -lvvp 8000 

qui commencera une instance de netcat écoute sur le port 8000, avec une sortie verbeuse. Dans votre autre terminal, exécutez la première commande. La première fois que vous l'exécutez, il va dire une connexion. Ensuite, le serveur/l'écouteur se fermera, donc la prochaine fois que vous l'exécuterez, il indiquera que le serveur était en panne.

+0

N'est-ce pas similaire à l'utilisation de fuser ou netstat, sauf que cela peut être exécuté à partir d'une autre machine? – nagul

+0

Oui, il peut absolument être exécuté à partir d'une autre machine. Il suffit de mettre le nom d'hôte distant à la place de localhost, bien sûr. Ce n'est pas exactement la même chose que netstat puisque le serveur ne peut être configuré que sur localhost et par conséquent rejeter les connexions distantes, par exemple. Mais pour vos besoins, c'est probablement assez proche. –

Questions connexes