Tatsächlich gibt es eine Möglichkeit, dies zu tun. Seit Kernel 3.3 mit gesetztem CONFIG_CHECKPOINT_RESTORE (das in den meisten Distributionen gesetzt ist), gibt es /proc/sys/kernel/ns_last_pid, das die letzte vom Kernel generierte PID enthält. Wenn Sie also die PID für ein gegabeltes Programm festlegen möchten, müssen Sie diese Aktionen ausführen:
- Öffne /proc/sys/kernel/ns_last_pid und hole fd
- mit LOCK_EX beflocken
- PID-1 schreiben
- Gabelung
Voilà! Das Kind erhält die von Ihnen gewünschte PID. Vergessen Sie auch nicht, ns_last_pid zu entsperren (mit LOCK_UN zu sperren) und zu schließen.
Sie können den C-Code hier in meinem Blog auschecken.
Wie viele bereits vorgeschlagen haben, können Sie eine PID nicht direkt setzen, aber normalerweise haben Shells die Möglichkeit, zu wissen, welche die letzte gegabelte Prozess-ID ist.
Beispielsweise können Sie in bash eine ausführbare Datei im Hintergrund erstellen (anhängen von &
) und finden Sie seine PID in der Variablen $!
.Beispiel:
$ lsof >/dev/null &
[1] 15458
$ echo $!
15458
Unter CentOS7.2 können Sie einfach Folgendes tun:
Angenommen, Sie möchten den Sleep-Befehl mit einer PID von 1894 ausführen.
sudo echo 1893 > /proc/sys/kernel/ns_last_pid; sleep 1000
(Denken Sie jedoch daran, dass, wenn zufällig ein anderer Prozess in der extrem kurzen Zeit zwischen dem Echo- und dem Sleep-Befehl ausgeführt wird, Sie mit einer PID von 1895+ enden könnten. Ich habe es hunderte Male getestet und es ist nie passiert Wenn Sie die PID garantieren möchten, müssen Sie die Datei sperren, nachdem Sie in sie geschrieben haben, Schlaf ausführen und dann die Datei entsperren, wie in Ruslans Antwort oben vorgeschlagen.)