2013-05-10 3 views
1

Je semble avoir une impasse. J'ai des scripts perl qui forcent et appellent d'autres scripts Perl. Et le processus est suspendu quelque part.Processus bloque et PIPE est bloqué

Je cours le programme sur: Darwin Kernel Version 12.3.0: Sun Jan 6 22:37:10 PST 2013; racine: XNU-2050.22.13 ~ 1/RELEASE_X86_64 x86_64

"lsof" dispose de 4 entrées se référant à la même PIPE:

perl5.12 1414 racine 1 PIPE 0x48937dc1254fe937 16384 -> 0x48937dc1254fe727

perl5. 12 1768 1 racine PIPE 0x48937dc1254fe937 16384 -> 0x48937dc1254fe727

perl5.12 1759 racine 1 PIPE 0x48937dc1254fe937 16384 -> 0x48937dc1254fe727

perl5.12 1760 racine 1 PIPE 0x48937dc1254fe937 16384 -> 0x48937d Je soupçonne que c'est la cause du blocage. Avons-nous des commandes qui pourraient me dire quel processus lire/écrire dans ce PIPE? Ou toute autre information serait appréciée. Merci d'avance!

+0

Bonne question, mais hors sujet ici. Essayez serverfault ou superutilisateur. – pilcrow

Répondre

0

Il y a deux possibilités probables que je peux penser:

  1. impasse est là en raison de la mise en mémoire tampon de sortie. Essayez d'activer autoflush sur tous les canaux de sortie. Cela est probable si deux processus communiquent de manière bidirectionnelle à l'aide de canaux: ils écrivent chacun quelque chose et attendent de lire une réponse, mais comme la sortie est mise en mémoire tampon, la réponse n'est jamais envoyée au canal.

  2. Un processus attend EOF sur le tuyau, mais il ne vient jamais. Si le canal est créé dans un processus parent puis hérité par un processus enfant, vous devez vous assurer que tous les processus ferment l'extrémité d'écriture du canal afin que le lecteur lise EOF.

+0

Merci pour la réponse rapide. J'ai essayé d'activer autoflush sur tous les fds (fd-> autoflush;) pour les scripts qui sont suspendus (ps -ax). Mais ça aide. J'ai également veillé à ce que toutes les ouvertures soient fermées. Est-il possible de savoir quel script est en train de lire ou d'écrire dans le PIPE? Merci. – AnuRV

+0

Puis-je éventuellement fermer toutes les poignées de fichier ouvertes d'un processus particulier? Je n'ai pas de système de fichiers proc (/ proc//fd). – AnuRV

+0

Peut-être pouvez-vous utiliser 'dtruss' pour voir ce que fait chaque processus. Mais je pense que vous trouverez juste qu'ils sont tous dans 'read()', je ne sais pas combien ça va aider. – Barmar