En realidad, hay una manera de hacer esto. Desde el kernel 3.3 con el conjunto CONFIG_CHECKPOINT_RESTORE (que está configurado en la mayoría de las distribuciones), hay /proc/sys/kernel/ns_last_pid que contiene el último pid generado por el kernel. Por lo tanto, si desea configurar el PID para un programa bifurcado, debe realizar estas acciones:
- Abra /proc/sys/kernel/ns_last_pid y obtenga fd
- empújelo con LOCK_EX
- escribir PID-1
- tenedor
¡Voila! El niño tendrá el PID que desea. Además, no olvide desbloquear (rebaño con LOCK_UN) y cerrar ns_last_pid.
Puede consultar el código C en mi blog aquí.
Como muchos ya sugirieron, no puede establecer directamente un PID, pero generalmente los shells tienen facilidades para saber cuál es el último ID de proceso bifurcado.
Por ejemplo, en bash puede iniciar un ejecutable en segundo plano (añadiendo &
) y encuentra su PID en la variable $!
.Ejemplo:
$ lsof >/dev/null &
[1] 15458
$ echo $!
15458
En CentOS7.2, simplemente puede hacer lo siguiente:
Digamos que desea ejecutar el comando de suspensión con un PID de 1894.
sudo echo 1893 > /proc/sys/kernel/ns_last_pid; sleep 1000
(Sin embargo, tenga en cuenta que si por casualidad se ejecuta otro proceso en el tiempo extremadamente breve entre el comando echo y sleep, podría terminar con un PID de 1895+. Lo he probado cientos de veces y nunca ha sucedido. para mí Si desea garantizar el PID, deberá bloquear el archivo después de escribirlo, ejecutar la suspensión y luego desbloquear el archivo como se sugiere en la respuesta de Ruslan anterior).