Comment fermer un descripteur de fichier via la commande de shell Linux
Dans /proc/pid/fd/
, il y a trop de descripteurs de fichiers. Puis-je utiliser le shell de commande pour fermer ces descripteurs de fichiers?
Le processus qui est-il? Est-ce votre programme? Pouvez-vous poster quelques source?
J'ai eu un cas où certains commerciaux application ouvre le même fichier avec plus de 1000 descripteurs de fichier, puis a couru de descripteurs de fichiers. L'application a même été incapable de mettre fin à bien ses propres commandes, donc j'ai dû le tuer. Si j'ai été en mesure de fermer certains des descripteurs de fichiers, le programme aurait été en mesure de mettre fin à plus proprement.
J'ai eu un cas où certains commerciaux application ouvre le même fichier avec plus de 1000 descripteurs de fichier, puis a couru de descripteurs de fichiers. L'application a même été incapable de mettre fin à bien ses propres commandes, donc j'ai dû le tuer. Si j'ai été en mesure de fermer certains des descripteurs de fichiers, le programme aurait été en mesure de mettre fin à plus proprement.
OriginalL'auteur Eric | 2011-05-13
Vous devez vous connecter pour publier un commentaire.
Vous pouvez certainement fermer fd d'autres processus en cours d'exécution aussi longtemps que vous avez les autorisations pour le faire.
Tout d'abord, trouver le PID.
Ensuite, lancer gdb et l'attacher au processus:
Ensuite, appelez la clôture de l'appel système sur le fd vous souhaitez fermer:
Si le descripteur de fichier est une fuite de l'un, puis le programme va essayer de ne jamais l'utiliser à nouveau de toute façon, et il ne devrait pas causer des problèmes. Le programme a probablement un bug, cependant.
OriginalL'auteur Thomas Vander Stichele
Vous pouvez fermer un FD
n
de l'actuel processus de bash comme:OriginalL'auteur Ignacio Vazquez-Abrams
J'ai couru dans une situation similaire, mais où
gdb
n'était pas une option, car elle a perturbé les contraintes temps-réel de ma demande et déformée de mon essai.Alors je suis venu avec un rapide
iptables
règle. Arguments facultatifs mis en place entre crochets ([ opt ]
).Trouver votre adresse de destination et le port:
netstat --program [ --numeric-host --numeric-ports ] | grep [<pid>]/[<appname>]
Ici, je voudrais couper
10.56.4.79:57000
.Créer un
iptables
règle pour couper la prise:iptables -A OUTPUT [ --out-interface <if> --protocol <tcp|udp|unix> ] --destination <addr> --dport <port> --jump DROP
À ce stade, votre programme ne peut pas envoyer des paquets vers le lointain de l'hôte. Dans la plupart des cas, la connexion TCP est fermée. Vous pouvez continuer à faire vos tests si il y a quelques.
Supprimer la
iptables
règle:Vous tapez simplement dans la même
iptables
règle de remplacement de laA
par unD
.La question est générique pour les descripteurs de fichier; votre réponse est pour les connexions réseau. Et la plupart de tous, il ne pas fermer le descripteur de fichier; il tombe le trafic réseau.
Si votre application se comporte correctement, ce qui conduit à la fin de la connexion TCP et de le descripteur de fichier. Comme je l'ai dit dans ma réponse "Dans la plupart des cas, la connexion TCP est fermée." Ce n'est pas une panacée, mais si on peut aider les gens...
Seulement si "keepalive" option est utilisée dans le protocole TCP: Sinon morts connexions peuvent y rester jusqu'à la fermeture ou en cours de réinitialisation.
OriginalL'auteur YSC
@Thomas réponse est valide uniquement lorsque les informations de débogage pour
close()
appel est installé.Sans les informations de débogage installé, gdb refuse d'appeler
close()
:La manière la plus simple de gdb appel
close()
dans ce cas consiste à lancer l'appel àclose()
type de retour:Voir gdb la documentation:
OriginalL'auteur ks1322
Vous ne pouvez pas simplement aller autour de la fermeture d'autres processus de " descripteurs de fichier et attendre d'eux de continuer à travailler.
Corriger le programme qui a trop de fichiers ouverts pour faire ouvrir de moins en moins. Cela peut être une config de changer ou de modifier le code source etc. Vous ne pouvez pas simplement fermer les fichiers.
Dans mon cas, j'ai eu une longue accroché processus de traitement par lots, car une lecture à partir d'une adresse http socket était mort. La fermeture de la fd @ThomasVanderStichele décrit résolu le problème pour moi 🙂
OriginalL'auteur MarkR