2016-11-01 1 views
3

Est-il possible d'empêcher la réutilisation d'un PID?Bash: Est-il possible d'empêcher la réutilisation d'un PID?

Par exemple, si j'exécuter un travail myjob en arrière-plan avec myjob &, et obtenir le PID à l'aide PID=$!, est-il possible d'empêcher le système Linux de réutiliser ce PID jusqu'à ce que je l'ai vérifié que le non PID existe plus (le processus est terminé)?

En d'autres termes, je veux faire quelque chose comme:

myjob & 
PID=$! 
do_not_use_this_pid $PID 
wait $PID 
allow_use_of_this_pid $PID 

Les raisons de vouloir le faire ne font pas beaucoup de sens dans l'exemple ci-dessus, mais envisager de lancer plusieurs tâches de fond en série et en attente pour eux tous à finir.

Certains programmeurs ont raison de signaler que 2 processus peuvent partager le même PID. C'est exact, mais pas ce que je demande ici. Je demande une méthode pour empêcher qu'un PID soit réutilisé après qu'un processus ait été lancé avec un PID particulier. Et puis aussi une méthode de réactiver son utilisation plus tard après avoir fini de l'utiliser pour vérifier si mon processus d'origine a fini.

Comme il a été demandé, voici un cas d'utilisation:

  • lancer plusieurs tâches de fond
  • obtenir PID des travaux d'arrière-plan
  • empêchent de PID d'être ré-utilisé par un autre processus après arrière-plan l'emploi prend fin
  • chèque « emplois de base » du PID - de, par exemple pour assurer les travaux d'arrière-plan finition
  • [note si la réutilisation PID désactivée pour les années PID des travaux d'arrière-plan ces PIDs POUVAIT t être utilisé par un nouveau processus qui a été lancé après un processus d'arrière-plan mis fin] *
  • réactivez PID des travaux d'arrière-plan
  • répétition

* Des explications complémentaires:

  • On suppose 10 emplois lancé
  • Job 5 sorties
  • Nouveau processus par un autre utilisateur, par exemple, ils se connecter à un TTY
  • Le nouveau processus a le même PID que Job 5!
  • Maintenant, notre script vérifie la fin du Job 5, mais voit PID utilisé par tty!
+0

Le noyau l'interdit déjà. Aucun processus n'a le même pid. –

+0

@Someprogrammerdude D'accord, je ne l'ai pas assez bien expliqué, je vais éditer ma question, une seconde – user3728501

+1

Peut-être que vous pouvez ajouter la cas d'utilisation? Dites-nous quel problème vous essayez de résoudre? Lecture connexe sur [le problème XY] (http://xyproblem.info/) –

Répondre

1

Sauf si vous avez récupéré la valeur de retour du processus fils, il existera dans le noyau. Cela signifie aussi que le pid est lié et ne peut pas être réutilisé pendant ce temps.

6

Vous ne pouvez pas "empêcher" un PID d'être réutilisé par le noyau. Cependant, je suis enclin à penser que ce n'est pas vraiment un problème pour vous. Mais envisagez de lancer plusieurs tâches d'arrière-plan en série et d'attendre que toutes ces tâches se terminent.Un wait simple (wait) (sans arguments) attendrait que tous les processus enfants se terminent. Vous n'avez donc pas besoin de vous inquiéter des PID en cours de réutilisation. Lorsque vous lancez plusieurs processus d'arrière-plan, il est en effet possible que les PID puissent être réutilisés par d'autres processus. Mais ce n'est pas un problème car vous ne pouvez pas wait sur un processus, sauf s'il s'agit de votre processus enfant.

Sinon, vérifier si l'un des travaux d'arrière-plan que vous avez démarré est terminé par un autre moyen que wait est toujours peu fiable.

+1

Pour continuer, si vous essayez d'attendre un processus qui n'est * pas * un enfant du shell en cours, 'wait' imprime un message d'erreur et quitte avec le statut 127. Ce ne sera pas le statut de sortie d'un processus normal, vous permettant de distinguer entre une erreur dans l'un de vos enfants et la tentative d'attente un travail terminé dont l'ID de processus peut être utilisé ailleurs. – chepner

+0

'wait' a le problème exact. Si je lance 2 processus d'arrière-plan, je ne peux pas dire dans quel ordre je devrais les «attendre» pour qu'ils finissent.On peut finir pendant que je cours la commande 'wait' avec les autres PID! Dans ce cas, le PID du processus fini peut être réutilisé. – user3728501

+0

Les ID de processus sont * au moins * 16 bits; Êtes-vous vraiment préoccupé par le fait que votre machine engendre plus de 60 000 nouveaux processus entre le moment où vous terminez un travail et celui où vous attendez que l'autre revienne? – chepner

0

également suggéré de contourner cela - si vous pensez qu'un PID affecté à l'un de vos tâches d'arrière-plan est réaffecté, vérifiez dans ps pour voir si elle est encore votre processus avec votre exécutable et a PPID (PID parent) 1.

0

Si vous avez peur de la réutilisation PID, qui ne se produira pas si vous wait que d'autres réponses expliquent, vous pouvez utiliser

echo 4194303 > /proc/sys/kernel/pid_max 

pour diminuer votre peur ;-)

+0

Sauf si je ne comprends pas quelque chose ici, si je dois attendre plus d'un PID, il est possible qu'un autre PID soit réutilisé dans le cas où les commandes d'attente finiraient dans le désordre – user3728501