Est-il possible de réussir les opérations de recherche () sur un retour de canal nommé?

12

Existe-t-il un moyen de faire en sorte que lorsque les programmes tentent d'effectuer des seek()opérations sur un canal nommé, il reviendra avec succès (mais agira comme si le canal était un fichier vide) au lieu de «Recherche illégale»?

J'ai tous les derniers morceaux de connexion sur mon système stockés dans une base de données SQLite, je n'ai aucun fichier nulle part. Cependant, il existe quelques programmes qui ont des problèmes avec cela. Il y a 2 cas spécifiques;

  • Un programme veut écrire dans un fichier journal que syslog-ng a créé en tant que canal nommé et lit à partir de. Le programme veut effectuer un seek()pour une raison quelconque, puis échoue.
  • Un programme (tel que denyhosts ou fail2ban) souhaite lire à partir d'un fichier journal que syslog-ng a créé en tant que canal nommé et dans lequel il écrit. Le programme veut effectuer un seek()sur et échoue.

Idéalement, j'aimerais simplement que ces recherches se comportent comme si le canal nommé n'était qu'un fichier vide. Je ne vois aucune raison pour laquelle un programme écrivant un journal devrait de toute façon effectuer une recherche, il devrait simplement ouvrir le fichier pour l'ajouter et commencer à écrire. Je peux voir pourquoi une lecture de programme voudrait chercher, afin qu'elle puisse reprendre à partir de sa dernière position, et je voudrais donc qu'elle se comporte comme si le fichier était vide (comme s'il avait été tronqué).

Y a-t-il donc une option qui peut être définie sur les canaux nommés pour qu'ils se comportent de cette façon? Sinon, y a-t-il un mode qui peut être défini lorsque syslog-ng ouvre le canal pour qu'il se comporte de cette façon (je suis prêt à faire des changements de code)? Ou suis-je dans un ruisseau?

Patrick
la source

Réponses:

10

Des canaux recherchables ont été proposés pour le noyau Linux, mais je ne connais pas de correctif fonctionnel pour les implémenter.

Vous pouvez utiliser une LD_PRELOADbibliothèque 'ed qui remplace l' lseekappel sur des fichiers spécifiques. Je ne connais aucun emballage standard à cet effet. Shadowfs pourrait aider à en écrire un.

Gilles 'SO- arrête d'être méchant'
la source
1
Je vais essayer la route LD_PRELOAD. Ce n'est pas la meilleure solution, mais cela devrait être faisable.
Patrick
Btw, aurait-il besoin d'un tuyau recherché pour que moins puisse suivre le tuyau de la même manière qu'il peut suivre le fichier? Je demande dans le contexte de Follow a pipe using less? question (vous préférerez peut-être y répondre).
Piotr Dobrogost
@PiotrDobrogost Dans le contexte de la Fcommande en moins, il suffirait de moins pour rafraîchir l'écran s'il n'obtient aucune sortie pendant une seconde environ. Rendre les pipes recherchables n'aiderait pas: la différence pertinente qui existe Fva à la fin du fichier, puis attend que les données apparaissent après la fin - mais pour une pipe, la fin du fichier ne survient que lorsque le rédacteur ferme le fichier.
Gilles 'SO- arrête d'être méchant'
1

Si l'application appelle la recherche, elle est soit cassée, soit n'est pas destinée à fonctionner sur les tuyaux. Si le premier, alors il doit être corrigé. Si ce dernier, alors il s'attend à ce que la recherche fonctionne réellement, mentir et prétendre que cela a fonctionné alors qu'il ne l'a pas causé entraînera presque certainement un fonctionnement incorrect.

De plus, si le fichier journal est remplacé par un canal nommé, alors un seul processus peut le lire à la fois. Ce devrait être une prise à la place.

psusi
la source
2
N'est pas destiné à travailler sur des tuyaux ne signifie pas que je ne peux pas travailler sur des tuyaux. Que se passe-t-il si l'application effectue simplement un SEEK_END pour arriver à la fin du fichier? Ou peut-être qu'il fait un SEEK_CUR pour trouver l'emplacement actuel. Aucun de ces éléments ne poserait de problème si je mentais au programme au sujet des résultats de la recherche. Le seul endroit qui se briserait serait si l'application essayait de revenir en arrière et d'écraser les données déjà écrites, ce qu'elle ne devrait pas faire avec les fichiers journaux. Et oui, je suis conscient de la limitation d'un processus par canal. Ce ne sera pas un problème.
Patrick
1
Si tout ce qu'il fait est de chercher à la fin pour l'ajouter, alors il devrait simplement ouvrir le fichier en mode ajout, de sorte qu'il tombe dans la catégorie cassée. Les applications n'essaient pas de trouver l'emplacement actuel, sauf si elles doivent pouvoir chercher ailleurs, puis revenir à l'emplacement actuel, de sorte qu'il tombe dans la catégorie «vous allez le casser en échouant silencieusement». Il est très peu probable qu'un programme appelle la recherche mais n'en a pas vraiment besoin pour fonctionner (et s'il le fait, il tombe dans la catégorie cassée).
psusi
1
Pas vrai. De nombreuses applications recherchent la fin du fichier au cas où un autre programme aurait écrit dans le fichier depuis la dernière fois. Sinon, écrire là où il se trouve actuellement perturberait les changements de l'autre programme. Et si sa lecture du fichier, il peut vouloir utiliser SEEK_CUR pour obtenir son emplacement actuel afin que lorsque le programme redémarre, il peut reprendre là où il s'était arrêté.
Patrick
1
@Patrick, pour le premier, s'il est ajouté, il devrait rouvrir le fichier en mode ajout. Dans ce cas, vous parlez de lecture, auquel cas, cela n'a pas de sens d'ignorer les nouvelles données qu'il n'a pas encore lues (et ignorer silencieusement la recherche casserait cela). Quant à ce dernier, s'il essaie d'utiliser la recherche pour revenir à la même position après la fermeture et la réouverture du fichier qui se cassera sur un tuyau si vous ignorez silencieusement la recherche, car lorsqu'il ferme le tuyau, le serveur obtient un SIGPIPE, qui le fait probablement réinitialiser pour que le prochain client qui ouvre le canal démarre au début.
psusi