Ve skutečnosti existuje způsob, jak to udělat. Od jádra 3.3 se sadou CONFIG_CHECKPOINT_RESTORE (která je nastavena ve většině distribucí) existuje /proc/sys/kernel/ns_last_pid, který obsahuje poslední pid generovaný jádrem. Pokud tedy chcete nastavit PID pro rozvětvený program, musíte provést tyto akce:
- Otevřete /proc/sys/kernel/ns_last_pid a získejte fd
- přidejte LOCK_EX
- zapište PID-1
- rozvětvení
Voilà! Dítě bude mít PID, které jste chtěli. Také nezapomeňte odemknout (hrnout s LOCK_UN) a zavřít ns_last_pid.
Kód C si můžete prohlédnout na mém blogu zde.
Jak již mnozí navrhovali, nemůžete nastavit přímo PID, ale obvykle mají shelly zařízení, aby věděly, které je poslední rozvětvené ID procesu.
Například v bash můžete spustit spustitelný soubor na pozadí (přidat &
) a najděte jeho PID v proměnné $!
.Příklad:
$ lsof >/dev/null &
[1] 15458
$ echo $!
15458
Na CentOS7.2 můžete jednoduše provést následující:
Řekněme, že chcete provést příkaz spánku s PID 1894.
sudo echo 1893 > /proc/sys/kernel/ns_last_pid; sleep 1000
(Mějte však na paměti, že pokud se náhodou jiný proces spustí v extrémně krátkém čase mezi příkazem echo a sleep, můžete skončit s PID 1895+. Testoval jsem to stokrát a nikdy se to nestalo mně. Pokud chcete zaručit PID, budete muset soubor po zápisu zamknout, spustit režim spánku a pak soubor odemknout, jak je navrženo v Ruslanově odpovědi výše.)