Fórum Root.cz

Hlavní témata => Server => Téma založeno: Pepa 06. 11. 2017, 14:59:47

Název: Jak zjistit PID spuštěné funkce
Přispěvatel: Pepa 06. 11. 2017, 14:59:47
Ahoj, potřebuji spustit funkci s názvem test_f a uvnitř té funkce potřebuji sjistit PID te spuštěné funkce test_f. Jde to nějak? Děkuji
Název: Re:Jak zjistit PID spuštěné funkce
Přispěvatel: Danny 06. 11. 2017, 15:21:15
shell proměnná $$
Název: Re:Jak zjistit PID spuštěné funkce
Přispěvatel: Danny 06. 11. 2017, 15:22:46
shell proměnná $$
teď jsem si uvědomil, žes nenapsal, v jakém jazyce to chceš: nějak jsem předpokládal shellscipt, nevím proč

PID se neváže k funkcím, ale k procesům

zjistí ho třeba fce getpid() v C
Název: Re:Jak zjistit PID spuštěné funkce
Přispěvatel: Pepa 06. 11. 2017, 15:38:58
Omlouvám se, jedná se o shell ;) ale stejně PID nesedí

Kód: [Vybrat]
function test_f(){
          echo $$ > /pid
}

test_f&

v souboru /pid mám jiný PID než ve skutečnosti ten proces má.
Název: Re:Jak zjistit PID spuštěné funkce
Přispěvatel: pb 06. 11. 2017, 15:59:17
Co znamená to & ? Jestli to, co intuitivně chápu já, tudíž, že to spustí na pozadí, tak se tam udělá fork,
a v něm se spustí funkce test_f, pak pochopitelně do /pid se zapíše tohle pid toho "forku", fork si v
klidu skončí, všechno je vpořádku a pravda, ale v /pid pid toho, v čem běžela ta funkce, ale ne pid
toho hlavního skriptu.
Název: Re:Jak zjistit PID spuštěné funkce
Přispěvatel: dustin 06. 11. 2017, 15:59:57
https://unix.stackexchange.com/a/305361

Citace
Curly brace functions will run within the calling shell process, unless they need their own subshell which is:

    when you run them in the background with &
    when you run them as a link in a pipeline

Ty tam máš background, takže nový PID. Takže http://tldp.org/LDP/abs/html/internalvariables.html - $!, $$, $PPID, $BASHPID
Název: Re:Jak zjistit PID spuštěné funkce
Přispěvatel: armabeton 06. 11. 2017, 16:16:07
jinak - jste si jisty, ze je dobry napad ukladat neco do /pid, tj. do root adresare? Neni lepsi nekde v tmp udelat uniq. soubor?
Název: Re:Jak zjistit PID spuštěné funkce
Přispěvatel: Pepa 06. 11. 2017, 16:30:04
Co znamená to & ?
Spuštění na pozadí.
Název: Re:Jak zjistit PID spuštěné funkce
Přispěvatel: Pepa 06. 11. 2017, 16:31:10
jinak - jste si jisty, ze je dobry napad ukladat neco do /pid, tj. do root adresare? Neni lepsi nekde v tmp udelat uniq. soubor?
Není je to jen příklad, všechno patří to /tmp
Název: Re:Jak zjistit PID spuštěné funkce
Přispěvatel: Pepa 06. 11. 2017, 16:33:57
... ale v /pid pid toho, v čem běžela ta funkce, ale ne pid
toho hlavního skriptu.
opačně, ne? ;)
Název: Re:Jak zjistit PID spuštěné funkce
Přispěvatel: pb 07. 11. 2017, 07:55:35
... ale v /pid pid toho, v čem běžela ta funkce, ale ne pid
toho hlavního skriptu.
opačně, ne? ;)
Nevím. Vlastně záleží na tom, kdy se to $$ vyhodnotí, a to nevím. Víte to někdo, jen pro úplnost?
Název: Re:Jak zjistit PID spuštěné funkce
Přispěvatel: Tomas2 07. 11. 2017, 08:35:38
ne, v $$ je pid funkce test_f v době jejího spuštění. Výrazy (expression) uzavřené v {} nebo () se vyhodnocují až jejich voláním.

edit:

k původnímu dotazu. Funkce se chová správně, jak už ostatní psali, přidáním & za volání test_f vytvoříš nový proces, v něm si uložíš pid a pak se vrátíš zpět. Neměl bys ale nikdy volat & aniž bys za tím neměl alespoň wait, on se ti totiž ukončil i bash a pokud bys uvnitř test_f měl delší funkci, běží i po ukončení té hlavní, což je super.

Dej pryč ten & a budeš tam mít pid hlavní funkce. Podle tvého dotazu se ale kód chová správně, samotná funkce nemá žádné pid, to má až samotný proces.
Název: Re:Jak zjistit PID spuštěné funkce
Přispěvatel: . 07. 11. 2017, 16:15:36
On si je zjevně vědom toho, že ta funkce běží v novém procesu, chce to tak a je to naprosto legitimní. Teď chce zjistit PID toho procesu -- dustin už odpověděl, je to v $BASHPID. KONEC!