2010-05-13 7 views
1

J'ai un script bash qui agit comme shell par défaut pour un utilisateur qui se connecte par ssh. Il fournit un menu avec plusieurs options dont l'envoi d'un fichier en utilisant netcat. Le netcat du linux embarqué que j'utilise n'a pas l'option -w, donc si l'utilisateur ferme la connexion ssh sans jamais envoyer le fichier, la commande netcat attend éternellement.Comment savoir à partir d'un script bash si l'utilisateur ferme brutalement la session ssh

J'ai besoin de savoir si l'utilisateur ferme brutalement la connexion afin que le script puisse tuer la commande netcat et quitter normalement.

choses que j'ai essayé jusqu'à présent:

  • piégeant les SIGHUP: il n'est pas délivré. Le seul signal que j'ai pu trouver est SIGCONT, mais je ne pense pas que ce soit fiable et portable.
  • Jouer avec l'option -t de la commande de lecture pour détecter un stdin fermé: cela fonctionnerait sinon pour un bug idiot dans la commande de lecture intégré (uniquement fois sur la première invocation)

Editer:

Je vais essayer de répondre aux questions dans les commentaires et d'expliquer la situation plus loin.

Le code que j'ai est:

nc -l -p 7576 > /dev/null 2>> $LOGFILE < $TMP_DIR/$BACKUP_FILE & 
wait 

j'ignore SIGINT et SIGTSTP, mais je l'ai essayé de piéger tous les signaux et le seul reçu est SIGCONT. Lecture de la page de manuel bash J'ai découvert que SIGHUP doit être envoyé à la fois à script et à netcat et que SIGCONT est envoyé aux travaux arrêtés pour s'assurer qu'ils reçoivent le SIGHUP.

Je suppose que l'attente rend le compte de script arrêté et il reçoit le SIGCONT mais en même temps l'attente mange en quelque sorte le SIGHUP.

J'ai donc essayé de changer l'attente d'un sommeil, puis les deux SIGHUP et SIGCONT sont reçus.

La question est: pourquoi l'attente bloque-t-elle le SIGHUP?


Edit 2: Résolu

I a résolu interrogation pour une entrée standard fermée avec la commande interne de lecture en utilisant l'option -t. Pour contourner le bogue dans la lecture BuiltIn je Spawn dans une nouvelle bash (bash -c « lire -t 3 factice »).

Répondre

0

Est-ce que le parent PiD change? Si c'est le cas, vous pouvez rechercher le parent dans la liste des processus et vous assurer que le nom du processus est correct.

+0

Il ne change pas même si elle est même pas un processus en cours d'exécution. – Figo

+0

Quels pièges avez-vous en place pendant l'exécution du script?La commande de piège en soi devrait vous le dire. –

+0

J'ai modifié le post pour répondre à votre question. – Figo

0

J'ai écrit des applications similaires. Il serait utile d'avoir plus de code dans votre shell. Je pense qu'il pourrait y avoir une façon d'écrire différemment votre programme global, ce qui permettrait de résoudre ce problème.

+0

Merci pour votre aide, mais je suis passé à un autre projet et maintenant je n'ai pas le code. – Figo

Questions connexes