2009-06-29 11 views
0

Je cours quelques serveurs Team Fortress 2 et je veux écrire un petit script de gestion.Problème avec fifo non bloquant dans bash

Fondamentalement, les serveurs TF2 sont un processus fg qui fournit une console du serveur, donc je peux démarrer le serveur, l'état de type et d'obtenir une réponse de celui-ci:

***@purple:~/tf2$ ./start_server_testing 
Auto detecting CPU 
Using AMD Optimised binary. 
Server will auto-restart if there is a crash. 

Console initialized. 
[bla bla bla] 
Connection to Steam servers successful. 
    VAC secure mode is activated. 

status 

hostname: Team Fortress 
version : 1.0.6.1/15 3883 secure 
udp/ip : ***.***.133.31:27600 
map  : ctf_2fort at: 0 x, 0 y, 0 z 
players : 0 (2 max) 

# userid name uniqueid connected ping loss state adr 

Grand, maintenant je veux créer un script qui envoie la commande sm_reloadadmins à tous mes serveurs. La meilleure façon de le faire est d'utiliser un tube nommé fifo. Maintenant, ce que je veux faire est d'avoir cette pipe en lecture seule et non bloquante au processus du serveur, donc je peux écrire dans le pipe et le serveur l'exécute, mais je veux encore écrire via le console le serveur, donc au processus fg du serveur et je tape le statut que je veux une réponse imprimée.

J'ai essayé (en supposant serverfifo est mkfifo serverfifo):

./start_server_testing < serverfifo 

ne fonctionne pas, le serveur ne commencera pas avant quelque chose est écrit à la conduite.

./start_server_testing <> serverfifo 

Cest travail assez bon, je peux voir la sortie de la console du serveur et je peux écrire sur le serveur fifo et exécute les commandes, mais je ne peux pas écrire via la console au serveur plus. De plus, si j'écris 'exit' sur le pipe (ce qui devrait terminer le serveur) et que je le lance dans un écran, la fenêtre de l'écran est détruite pour une raison quelconque (wtf pourquoi?). Je n'ai besoin que du serveur pour lire le fifo sans bloquer ET toute l'entrée de mon clavier sur le serveur lui-même doit être envoyée au serveur ET toute la sortie du serveur doit être écrite sur la console.

Est-ce possible? Si oui, comment?

+0

Je suppose en utilisant "./start_server_testing <> serverfifo" je remappe le stdio à serverfifo ainsi il perd mon clavier comme stdio. Est-il possible de mapper deux sources à la stdio d'un processus (ce qui serait dans mon cas keyboard et serverfifo) – timdel

+0

J'ai supprimé votre ajout récent, simplement parce que ce n'était pas une réponse. Je suis désolé que vous ne pensiez pas que le site vous a aidé, mais (re votre commentaire) je ne peux pas voir aucune preuve que quelqu'un soit "énervé" sauf vous-même - simplement quelqu'un qui vous a donné son idée ce que vous vouliez ... –

Répondre

1

Je réalise que ce n'est pas une réponse dans la même veine que vous poursuiviez, mais vous pouvez probablement le faire using Gnu Screen.

L'écran est un programme qui crée un pseudo-TTY. Vous pouvez utiliser sa capacité pour vous permettre de partager une session d'écran. De cette façon, vous pouvez être connecté au serveur à l'intérieur de l'écran, et votre script peut partager cette session, envoyer une commande que vous pouvez voir, puis arrêter le partage. Le process to get screen set up to allow sharing sessions is described here. Il nécessite un accès root, mais je présume que vous l'avez si vous utilisez un serveur TF2. Une fois que vous avez configuré le processus setuid et que l'invite du serveur s'affiche à l'écran, vous pouvez faire en sorte que votre script se connecte à la boîte appropriée, se connecter à l'écran, envoyer la commande souhaitée au serveur, envoyer Ctrl-A, d se déconnecter de l'écran, puis se déconnecter.

+0

Je suis en train d'utiliser un écran dans lequel je lance tous mes serveurs (CTRL + A, c fenêtres créées dans un écran). J'ai aussi écrit ceci: '[...] et je cours dans un écran la fenêtre de l'écran se fait tuer pour une raison quelconque (wtf pourquoi?). [...]' Mais maintenant, puis-je écrire dans l'écran peut-être?Je sais, si je crée un nouvel écran, je peux en quelque sorte envoyer une commande qui est exécutée par l'écran et puis détacher, mais puis-je envoyer une commande à un écran existant? – timdel

+0

Pas d'attente, je pense que l'utilisation d'un tuyau pour envoyer du texte à un processus est toujours une meilleure idée que de l'envoyer à l'écran. – timdel

+0

Ah. Je n'ai pas compris ce que vous disiez dans ce paragraphe. Le fait que vous utilisiez l'écran facilite déjà les choses. En réponse à votre question «puis-je envoyer une commande à un écran existant?», Ma réponse expliquait exactement comment vous alliez procéder. Où étais-je pas clair? –

Questions connexes