En fait, il existe un moyen de le faire. Depuis le noyau 3.3 avec l'ensemble CONFIG_CHECKPOINT_RESTORE (qui est défini dans la plupart des distributions), il y a /proc/sys/kernel/ns_last_pid qui contient le dernier pid généré par le noyau. Ainsi, si vous souhaitez définir un PID pour un programme dérivé, vous devez effectuer ces actions :
- Ouvrez /proc/sys/kernel/ns_last_pid et obtenez fd
- floquez-le avec LOCK_EX
- écrire PID-1
- fourche
Voilà ! L'enfant aura le PID que vous vouliez. N'oubliez pas non plus de déverrouiller (flock avec LOCK_UN) et de fermer ns_last_pid.
Vous pouvez consulter le code C sur mon blog ici.
Comme beaucoup l'ont déjà suggéré, vous ne pouvez pas définir directement un PID, mais les shells ont généralement la possibilité de savoir quel est le dernier ID de processus dérivé.
Par exemple en bash vous pouvez lancer un exécutable en arrière-plan (en ajoutant &
) et trouver son PID dans la variable $!
.Exemple :
$ lsof >/dev/null &
[1] 15458
$ echo $!
15458
Sur CentOS7.2, vous pouvez simplement faire ce qui suit :
Supposons que vous souhaitiez exécuter la commande sleep avec un PID de 1894.
sudo echo 1893 > /proc/sys/kernel/ns_last_pid; sleep 1000
(Cependant, gardez à l'esprit que si par hasard un autre processus s'exécute dans le laps de temps extrêmement court entre la commande echo et sleep, vous pourriez vous retrouver avec un PID de 1895+. Je l'ai testé des centaines de fois et cela ne s'est jamais produit Si vous voulez garantir le PID, vous devrez verrouiller le fichier après y avoir écrit, exécuter la mise en veille, puis déverrouiller le fichier comme suggéré dans la réponse de Ruslan ci-dessus.)