Üdv.
Elkezdtem írni egy webes admin felületet de elakadtam ott hogy az ssh2 protokollon keresztül elindított programnak visszakapjam a Process ID-ját
Vagyis inkább úgy írnám le hogy visszakapok egy ID-t de sajna az az igazi ID-nek az eggyel kisebb változata.
Példa:
amit a PHP visszaad: 1233
Linuxba pedig: 1234
A forráskódom:
$stream = ssh2_exec($con, 'cd /home/user; screen -A -m -d -S user ./parancs > /dev/null & echo $!');
stream_set_blocking($stream, true);
$data = "";
while ($buf = fread($stream,4096)){
$data .= $buf;
}
fclose($stream);
echo "
";
echo "PID: ".(int)$data;
Tehát a nagy kérdésem az az lenne hogy a valós PID-hez képest miért ad vissza a PHP 1-el kisebb értéket? Valakinek valami ötlet?
Előre is köszönöm a segítséget
- 1368 megtekintés
Hozzászólások
mert a screen "viewer" pidjet adja vissza, es nem a benne futtatott programet vagy a hatterben maradt screen "core"-et, az meg hogy egymas utani szamok, az meg az miatt lehet, hogy nem randomizalod PID-jeid, ha randomizalnad, akkor teljesen mast adna vissza
19610 pc Is 0:00.16 `-- /bin/tcsh
42501 pc S+ 0:00.01 `-- screen yes
42645 ?? Rs 0:16.26 `-- screen yes
42897 pd Rs+ 0:17.34 `-- yes
___
info
- A hozzászóláshoz be kell jelentkezni
1. megtudod-e mondani, hogy hogyan tudom a screenben futtatott program PID-jét visszakapni?
2. hogyan is működik ez a PID randomizálás?
- A hozzászóláshoz be kell jelentkezni
1. nem masztam bele a screenbe annyira, de pstree-bol fel tudod epiteni
2. sysctl kern.randompid=300 kernel oldali resze meg forrasban van, ami publikus - a lenyege, hogy a pid-ek nem egymast kovetoen vannak kiosztva, hanem random szam van hozzaadva / sorsolva
___
info
- A hozzászóláshoz be kell jelentkezni
screen -ls
de itt a screen multiplexere'nek a pid-je't kapod vissza. ez eggyel tobb mint amit a $! visszaad, viszont az a processz, amit elinditottal, annak nem ugyanaz a pid-je mint a screen multiplexere'nek:
apal@szofi:~$ screen -A -m -d sleep 100 &
[2] 17168
apal@szofi:~$ echo $!
17168
[2]+ Done screen -A -m -d sleep 100
apal@szofi:~$ ps -A xuf | tail -n 2
apal 17169 0.0 0.0 27880 1040 ? Ss 21:49 0:00 SCREEN -A -m -d sleep 100
apal 17170 0.0 0.0 12364 644 pts/7 Ss+ 21:49 0:00 \_ sleep 100
ez abbol is latszik, hogy a "&" az lenyegeben szuksegtelen, mert a `screen` maga megcsinalja a forkos levalasztast es a multiplexert (itt a 17169) megteszi processz leadernek. ez eleg gyakori trukk.
ha a tenylegesen futo parancsnak (fenti peldaban a 17170-esnek) a pid-jere vagy kivancsi, azt nem tudom hogyan lehet lekerdezni igy elsore. a `screen -ls` kiirja az aktualisan futo screeneket, de ott is csak a multiplexer pidje't kapod vissza, azon a ne'ven hivatkozol amikor `screen -r` segitsegevel visszatersz. a futo parancs az ennek a child-je (ott nyilvan nincs session leader, mert szopoag lenne ha nem tudna a multiplexer hogy a parancs az mikor is allt le).
A
- A hozzászóláshoz be kell jelentkezni