2013-08-08 14 views
9

Zastanawiam się, czy istnieje jakiś sposób zmuszenia do użycia określonego identyfikatora procesu w systemie Linux do jakiejś aplikacji przed uruchomieniem go. Muszę z góry znać identyfikator procesu.Jak ustawić ID procesu w systemie Linux dla określonego programu?

Dzięki

+2

Pachnie jak problem XY. Dlaczego potrzebujesz pid z wyprzedzeniem? –

+0

Z tego, co wiem o Linuksie i UNICE'ach ogólnie, byłbym zaskoczony, gdybyś mógł to zrobić, ale istnieje wiele sposobów na ustalenie PID danego procesu, gdy jest on uruchomiony. Być może powinieneś wyjaśnić, co chcesz robić i przyjąć sugestie dotyczące alternatyw. – deStrangis

+2

Krótka odpowiedź brzmi: nie. – devnull

Odpowiedz

14

Faktycznie, istnieje sposób, aby to zrobić. Ponieważ jądro 3.3 z ustawieniem CONFIG_CHECKPOINT_RESTORE (które jest ustawione w większości dystrybucji), istnieje/proc/sys/kernel/ns_last_pid, który zawiera ostatni pid generowany przez jądro. Tak więc, jeśli chcesz ustawić PID dla rozwidloną programu, należy wykonać następujące czynności:

  1. Otwórz/proc/sys/kernel/ns_last_pid i dostać fd
  2. stado go LOCK_EX
  3. zapisu PId- 1
  4. widelec

Voilà! Dziecko będzie miało PID, którego pragniesz. Nie zapomnij również odblokować (flock z LOCK_UN) i zamknąć ns_last_pid.

Możesz sprawdzić kod C na moim blogu here.

+0

Kod c jest częścią projektu criu. Plik/proc/sys/kernel/ns_last_pid nie istnieje we wszystkich systemach. Tak więc kod nie działa na Ubuntu. Czy istnieje sposób, w jaki mogę to zrobić, pracując nad ubuntu? – hebbo

+0

Kod @ hebbo powinien działać na dość niedawnym ubuntu. Testowany w dniach 14.04 i 14.10. –

+0

Podoba mi się ten pomysł, ale w większości praktycznych sytuacji jest to straszna sztuczka. :-RE –

1

Każdy proces w systemie Linux jest generowany przez fork() więc nie powinno być w żaden sposób wymusić konkretną PID.

+0

Z wyjątkiem kilku procesów uruchamianych magicznie przez jądro: '/ sbin/init' i być może '/ sbin/modprobe' etc ... (nie wspominając o' vfork' jako o wariancie 'fork') –

3

Jak już zasugerowano, nie można ustawić bezpośrednio PID, ale zwykle muszle mają możliwość sprawdzenia, który to ostatni rozwidlony identyfikator procesu.

Na przykład w bashu można zjeść plik wykonywalny w tle (dodając &) i znaleźć jego PID w zmiennej $!. Przykład:

$ lsof >/dev/null & 
[1] 15458 
$ echo $! 
15458 
2

Nie ma sposobu, aby zmusić do użytkowania określonej PID dla procesu. Jak Wikipedia mówi: Identyfikatory

procesowe są zwykle przyznawane na podstawie sekwencyjnego, począwszy od 0 i rośnie do maksymalnej wartości, która różni się od systemu. Po osiągnięciu tego limitu przydział rozpoczyna się od nowa o 300 i ponownie wzrasta o . W systemie Mac OS X i HP-UX, restartów alokacji 100. Jednak na ten i kolejny przechodzi każdy PID nadal przypisana do procesów są pomijane

+0

Dzięki za przydatne odpowiedzi.Chodzi o to, że próbowałem wygenerować odpowiedź na pakiet ICMP na podstawie identyfikatora procesu, do tego potrzebuję sumy kontrolnej opartej na PID z pierwotnego procesu. Dlatego właśnie muszę z góry znać ten PID, aby wygenerować odpowiednią sumę kontrolną. Oznacza to, że powinienem budować pakiet na życzenie w czasie rzeczywistym. Ale powinno to być znacznie łatwiejsze i możliwe do przygotowania, jeśli znam PID. Zakładam, że jedyną opcją jest hackowanie/modyfikowanie źródła linuxa w celu podania konkretnego PID w konkretnym przypadku. –

+0

Można uruchomić niektóre procesy z wyprzedzeniem podczas startu systemu, i ustawić je jako 'execve' później odpowiedni program (po zarejestrowaniu pid w niektórych znanych miejscach). Zdecydowanie uniknęłoby to włamania do jądra. –

+0

Dzięki, w końcu utworzę odpowiedź pakietu w czasie rzeczywistym na podstawie pakietu wejściowego. Dostałem więc sumę kontrolną w oparciu o wyodrębnianie identyfikatora procesu z oryginalnego pakietu i dając pewne opóźnienie dla aplikacji klienckiej, aby mieć czas na skonstruowanie pakietu i odpowiedź. Teraz to działa doskonale, więc wreszcie nie było potrzeby żadnego hakowania. –

Powiązane problemy