2017-01-01 1 views
0

J'ai rencontré un problème étrange (et probablement spécifique à une plate-forme) lorsque j'essaie de faire une boucle piège-sommeil.Signal Trapping dans bash ne fonctionne qu'une seule fois dans RHEL7 (mais pas dans Ubuntu)

Plus précisément, le code suivant:

saysomething() { 
    trap saysomething 37 
    echo "Hello there" 
    while true; do 
     sleep 1 
    done 
} 

echo "Current pid: $$" 
saysomething 

imprime "Bonjour" à chaque fois que je l'envoie un signal d'un autre shell en utilisant kill -37 <pid> sur Ubuntu 14.04.

Toutefois, sur une machine RHEL 7, les informations ci-dessus s'impriment Hello there uniquement la première fois. Après cela, le script continue à s'exécuter mais ne répond plus à aucun signal.

Quelle pourrait être la raison de cette différence?

+0

Désolé! lire trop vite. peut-être que vous pourriez le faire de l'extérieur de la fonction, alors. –

+1

Utilisez-vous la même version de 'bash' sur les deux machines? – chepner

+0

Non. On dirait que les versions 'bash' sont différentes. 4.3.11 sur Ubuntu et 4.2.46 sur RHEL 7. Cela conduirait-il à une telle différence de comportement? – balajeerc

Répondre

0

Pas vraiment une réponse, mais c'est la solution que je fini par utiliser ce qui suit comme une solution de contournement:

#!/usr/bin/env bash 

flag=false 

saysomething() { 
    flag=true 
    trap reset 37 
    echo "Hello there" 
    while [[ $flag == true ]]; do 
     sleep 1 
    done 
    saysomething 
} 

reset() { 
    flag=false 
} 

echo "Current pid: $$" 

saysomething 

Je ne peux pas expliquer la raison de cette différence de comportement bien.