ugrás a tartalomhoz

Process futtatása más felhasználóval (PHP, Apache2 és php-fpm)

sandrosdj · 2017. Okt. 20. (P), 13.09
Üdv mindenkinek!

Debian alatt szeretnék futtatni cli parancsokat php-vel, egy bizonyos felhasználóval.

Jelenlegi állás szerint Apache2 van felrakva fcgid-vel, ami a megfelelő php-fpm pool-lal kommunikál. Ez a pool "webuser" felhasználóval és "www-data" csoporttal fut.
Ha ebben az esetben futtatok egy parancsot, akkor az ugyan ezzel a felhasználóval fog futni. Ez az, amin változtatni szeretnék. /webuser helyett www-data felhasználóval szeretném futtatni a parancsot, sudo nélkül/

Processz indulásakor nem várok annak a befejeződésére, hanem a háttérbe passzolom, valamint kiíratom a PID-t, amit eltárolok, és az szerint ellenőrzöm, hogy fut-e még.
/Mielőtt nekiálltam sudo-t használni, minden működött./

Gondoltam, "sudo -u www-data" -val megoldódik minden problémám, de azt nem vettem számításba, hogy az overhead mellett így a sudo pid-jét kapom vissza. Ezt hiába lövöm le, az általa futtatott processz tovább fut.

Hogy lenne a legcélszerűbb megoldani azt, hogy leállítható maradjon a sudo által futtatott folyamat illetve annak a pid-jét kapjam vissza?


Extra info:
A parancsokat az exec() függvénnyel adom ki.
Startnál basically: sudo -u www-data **COMMAND** > /dev/null 2>&1 & echo $!
- pid lementve
Stop: sudo kill **PID** -10mp várakozás- ha nem állt le: sudo kill -9 **PID**
 
1

SUID

janoszen · 2017. Okt. 20. (P), 13.37
Egyrészt szerintem írd le hogy mit próbálsz meg pontosan megvalósítani, mert ez amit leírsz architekturálisan egy borzalmasan rossz ötlet. Szinte biztos, hogy ezt korrektül így nem lehet megvalósítani.

Ha ennek ellenére szeretnél magadra bajt hozni, akkor a futtatandó parancs tulajdonosa legyen a céluser (tehát pl. www-data) és legyen beállítva rajta a SUID bit. Ezzel a parancs nem a meghívó, hanem a tulajdonos userként fog futni.
2

Példa

sandrosdj · 2017. Okt. 20. (P), 14.39
Adott n-féle binary, ezeknek különböző paraméterei, stb.

Vegyünk példának egy java alkalmazást:
Szeretném webes felületről elindítani, leállítani.

Az indításhoz és leállításhoz a topikindítóban leírtak szerint járok el jelenleg.
sudo -u www-data java -jar abc.war > /dev/null 2>&1 & echo $!
Ez a folyamat valamennyi ideig fut, akár évekig, ez nincs meghatározva.
Viszont szeretném tudni leállítani, és elindítani webes felületről, bármikor -realtime-.
3

Rossz úton jársz

janoszen · 2017. Okt. 20. (P), 15.07
Ha folyamatosan futó processeket szeretnél kezelni akkor ezzel nagyon rossz úton jársz. Ha ugyanis "csak úgy" elindítod a folyamatot, akkor az az Apache process gyereke marad a process treeben. Ha pedig lecsatlakozik az indított folyamat, akkor megint csak PID problémáid lesznek. Szóval az egész így eléggé házibarkács szagú és random fura bugokhoz fog vezetni.

Ha tehetek egy javaslatot és a feladat megengedi, nézd meg a Docker API-t. Gyakorlatilag HTTP-n tudsz vele beszélgetni és lehetőséged van nagyon lightweight containereket indítani mindenféle feladatokra. (Értsd: alig eszik többet mint ha csak simán elindítod a programot.) Cserébe a Docker megoldja neked az egész szolgáltatás menedzsment kérdés.

Ha ez nem járható út, akkor viszont kénytelen leszel valami olyan daemont keresni vagy implementálni ami elintézi helyetted a szolgáltatások elindítását és leállítását, mert az Apache alól elindított folyamatokkal sok boldogtalanságnak nézel elébe.
10

Nincs erre valamelyik control

inf · 2017. Okt. 23. (H), 20.08
Nincs erre valamelyik control panel-ben lehetőség?
4

systemd?

Poetro · 2017. Okt. 20. (P), 15.20
Miért nem systemd-t vagy hasonlót használsz a feladatra? Igy tudnád listázni a futó process-eket, a futtathatókat, azokat kényelmesen le tudod állítani, el tudod indítani, illetve újraindítani.
5

systemd

janoszen · 2017. Okt. 20. (P), 16.02
systemd-vel erdemes arra figyelni, hogy maga a daemon (tudtommal) nem kepes nem rootkent futni, igy csak akkor hasznalhato, ha magaban a gazda oprendszeren is ez van (pl. Ubuntu). en valami lightweightebbet es hordozhatobbat valasztanek.
6

Köszönöm a válaszokat

sandrosdj · 2017. Okt. 20. (P), 17.05
Köszönöm a válaszokat mindenkinek!

Ilyesmi úton indultam el. Mivel többször elég egyedi összeállítással kell dolgozni (különböző bin, paraméterek, stb.), írtam egy daemont, ami kezeli a parancsok futtatását. Ezt a systemd kezeli.

Socket-en lehet vele kommunikálni, tehát kipipáltam azt is, hogy remote lehessen parancsokat futtatni.
Elég fapados, tehát kb. annyival vagyok előrébb, hogy tudom futtatni a kívánt userrel a dolgokat és nem a webszerver child-processe.
Todo: multi-user support
7

PHP?

janoszen · 2017. Okt. 20. (P), 17.08
Mindez PHP-ban van irva, vagy valami mas nyelven? Ha PHP, akkor figyelj arra, hogy a PHP alig ad eszkozt arra hogy esetleges memleakeket, stb. kezelj. En a helyedben mast valasztanek / valami olyasmit valasztanek ami mar keszen van es nem neked kell karban tartani.
8

Pl ott az mcollective és az

BlaZe · 2017. Okt. 20. (P), 21.17
Pl ott az mcollective és az mc-shellcmd. Mondjuk nem olyan szexi, mint a Docker :) De pont ilyesmire van kitalálva. Lehet az is több, mint ami kell, de egy PHP agentnél kb minden jobb.
9

Es nincs ilyen sexy apija

janoszen · 2017. Okt. 20. (P), 21.36
Es nincs ilyen sexy apija. Docker swarmmal / servicekkel ezt annyira gyonyoruen meg lehet oldani, akar tobb gepre elosztva is.