J'ai un script bash qui effectue un traitement parallèle en boucle. Je ne veux pas que le processus parallèle pointe le CPU, donc j'utilise une commande de sommeil. Voici une version simplifiée.Bash: un sleep dans une boucle while obtient son propre pid
(while true;do sleep 99999;done)&
J'execute la ligne ci-dessus à partir d'une invite de bash et obtenir quelque chose comme: [1] 12345
Où [1]
est le nombre d'emplois et 12345
est l'ID de processus (pid) de la boucle while. Je fais kill 12345
et obtenir:
[1]+ Terminated (while true; do sleep 99999; done)
Il ressemble a pris fin le script entier. Cependant, je fais un ps aux|grep sleep
et je trouve que la commande sleep est toujours aussi forte mais avec son propre pid! Je peux tuer le sleep
et tout semble bien. Cependant, si je devais d'abord tuer le sommeil, la boucle while commence un nouveau sleep
pid. C'est une telle surprise pour moi puisque le sommeil n'est pas parallèle à la boucle while. La boucle elle-même est un seul chemin d'exécution.
J'ai donc deux questions:
- Pourquoi la commande sleep obtenir son propre ID de processus?
- Comment tuer facilement la boucle while et le sleep?
Je vois. Je pensais que «dormir» était une commande intégrée à bash, pas un processus. Cela a plus de sens maintenant. – User1
Si vous utilisez bash, 'type sleep' ou' type -a sleep' est préférable à 'which'. 'qui 'est un ordre externe; il ne peut pas détecter les alias, les fonctions ou les commandes intégrées. Comparez la sortie de 'which echo' et' type echo'. –
@ User1: Des choses comme 'echo' sont des commandes intégrées parce que cela les rend plus efficaces (et dans certains cas, comme' cd', parce qu'elles ont une sémantique qui ne peut être obtenue en exécutant une commande externe). L'efficacité de 'sleep' est sans importance, il n'y a donc pas grand intérêt à en faire un built-in. –