Jan 12 2009
web izstrāde – fona procesi
Pieņemsim, ka ir dots projekts, patiesībā tas pat var nebūt web projekts un tas vispār var nebūt projekts:) Lai nu kā tur būtu, bet ļoti bieži ir vajadzība palaist kādu fona procesu kādas nebūt darbības regulārai izpildei (manā gadījumā – *nix sistēmā). Atkāpei – fona process – tāds process, kurš netiek laists no pārlūkprogrammas, bet tiek izpildīts uz servera.
crontab
Kas pirmais nāk prātā? Pareizi – crontab. Crontab palaiž uzdoto komandu/skriptu uzdotajā laikā:
* * * * * komanda
- - - - -
| | | | |
| | | | +----- nedēļas diena (0 - 6) (0 - Svētdiena)
| | | +------- mēnesis (1 - 12)
| | +--------- datums (1 - 31)
| +----------- stunda (0 - 23)
+------------- minūte (0 - 59)
piemēram -
10 6 * * * rm -f /var/log/tmp*
un katru rītu 6:10 crontab izpildīs šo darbību. Bet ne par to tagad ir stāsts:) Kādi ir crontab ierobežojumi vai neērtības?
- intervāls ne mazāks par 1 min un tas ir fiksēts.
- ja process ir pietiekami biežs un regulārs, tam jāčeko vai iepriekšējais ir beidzies, jo pretējā gadījumā procesi saskrienas un var sanākt slikti.
- nepārskatāms procesa darbības progress (tik vien kā log faili)
- neērta procesu pārvaldība – jaunu pievienošana vai esošo modificēšana
screen
Varianti? Nē, php ciklu ar sleep() nu galīgi nevajadzētu laist, sleep f-ju vispār vajadzētu aizmirst un izsvītrot no pieejamo saraksta:) Reāli strādājošs variants ir primitīvs shell skripts, kas grieztu mūsu procesu (manā gadījumā php) mūžīgā ciklā:
create.sh
until [ 1 -eq 2 ]
do
/usr/local/bin/php /home/tmp/create.php
sleep 30
done
Tātad, kas mums te sanāk? Mūžīgs cikls, kas palaiž php un tad, kad tas ir beidzies tiek gaidītas 30 sekundes un process aiziet pa jaunu. Procesi nekad nesaskrienas, jo pauze ir starp iepriekšējā procesa beigām un nākamā sākumu. Attiecīgi, ja mūsu serveris pēkšņi ir uz kaut ko iesprindzis un šis php izpildās ilgāk, nekas ļauns nenotiek. Php skripts var saturēt arī kaut kādu output konsolē – aizmirstam par html un atceramies par “\r”, “\n”, “\t” – nu tā tīri ērtībai lai saprastu, ko tad tas mūsu process īsti dara.
Tiesa gan ar to vēl īsti nepietiks – šo shell skriptu varētu palaist daemon režīmā “./create.sh &”, bet daudz ērtāk būs izmantot komandu “screen“. Screen ir konsoles emulators, kurš ļauj tajā palaist dajebko. Pie kam multiuser režīmā. Plašākā screen iespēju aprakstā neizplūdīšu, to var izlasīt plašajās i-net ārēs, apmierināšos ar konkrētā shell skripta “iesēdināšanu” screen:
> screen -S createStaticFiles
atveras jauns screen un tam piešķiras nosaukums “createStaticFiles”
> ./create.sh
un aiziet mūsu skripts
Ctrl+A+D
>[detached]
kombinācija, lai izietu no atvērta screen
> screen -ls
There is a screen on:
3047.createStaticFiles (Detached)
1 Socket in /var/run/screen/S-root.
atvērto screen saraksts
>screen -x createStaticFiles
pieslēgties screenam ar nosaukumu createStaticFiles
Tas arī principā viss. Pēc tāda principa varam saražot screenus, cik vien nepieciešams un slēgties, skatīties, kas tur notiek jebkurā laikā.
Ērtības labad to visu vēl varētu iesēdināt servera startup procesos, lai kaut kādā brīdī restartējot serveri pēc tam nebūtu pārsteigums.
Un ar crontab jau nav tik ļauni – ir situācijas, kad vairāk noderīgs ir tieši tas. Piemēra pēc tie būtu nakts procesi, kad parasti tiek izpildītas visādas datu apkopošanas, veco datu tīrīšanas lietas.

Hmm .. un kas notiek, ja tavs loop’a process kādā brīdī nezināmu iemeslu pēc “nokillojas”?
Es savā laikā šo risināju ar 2 shell skriptiem – viens, kurš loop’ā dara to, ko jādara; un otrs, kurš reizi minūtē no crontab’a tiek palaists un ar GREP skatās, vai pirmais ir vai nav. Ja ir, exito, bet ja nav, piestartē no jauna.
Precizēju: ar GREP neskatās, ar PS skatās
ar GREP dabū 0 vai 1
Nu ja kaut kas nobeidzas php galā – sāpe maza – pēc brīža palaižas atkal, bet screen tā īsti nav manīts, ka būtu kādreiz nobeidzies.
uzrakstam savu serveri/deamonu, nav nemaz tik grūtu, un vismaz kaut kas ārpus php kubika.
protams, protams:)
es tikai piedāvāju vienu no daudziem variantiem kā ērtāk menedžēt šos procesus:)
*/30 * * * * komanda – šis ekzekjūtos komandu ik pa 30, ne? Šādi, protams, varam ekzekjūtot tikai tās komandas, kuras kaut ko pārbauda, nevis uzsāk nopietnāku procesu.
Es biju domājis – ik pa 30 sekundēm.
defektologs, pēc RTFM tas būs katras 30 minūtes.
Atvainojos, Tev taisnība.
cronā jau pa sekundēm nevarēs gan izsaukt neko, jo mazākais solis ir 1 minūte
nu var jau arii ieksh /etc/init.d/ vai rc.d likt iekshaa procesu kam visu laiku jaaiet piemeeram emailqueue.php vai cache_gc.php…
tachu kaa jaasaka kamer straadaa uz linuxiem buus jauki, kad paariesi uz solaris vai hp-ux buus citas komandas kaa “nohup” un “glance” iecieniitaa “top” vietaa un tas pats “ps” buus bikiit savaadaaks, taa ka ieteicams manaa uztveree PHP proketam minimizeet aareejos shel skriptus cik var. protams galiigi no tiem neizbeegt un jo sarezgiitaaki procesi veicami, jo vairaak tiec piesiec konkreetai videi
tachu jo viss vienkaarshaaks jo vieglaak administreejams ariidzen…