Jan 12 2009

web izstrāde – fona procesi

Publicēts 18:12 kategorijā projekts , Tagi:,

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?

  1. intervāls ne mazāks par 1 min un tas ir fiksēts.
  2. 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.
  3. nepārskatāms procesa darbības progress (tik vien kā log faili)
  4. 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.



Lasi vēl

  • mysql > gettext
  • atkal jau par iPad
  • iPhone Ziemassvētkos
  • stulba diena
  • iPhone – LV interface pack
  • 11 komentāri

    11 komentāri to “web izstrāde – fona procesi”

    1. NBDon 12 Jan 2009 at 18:33

      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.

    2. NBDon 12 Jan 2009 at 18:33

      Precizēju: ar GREP neskatās, ar PS skatās :) ar GREP dabū 0 vai 1 :)

    3. alxon 12 Jan 2009 at 18:38

      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.

    4. 3 variantson 14 Jan 2009 at 14:29

      uzrakstam savu serveri/deamonu, nav nemaz tik grūtu, un vismaz kaut kas ārpus php kubika.

    5. alxon 14 Jan 2009 at 14:34

      protams, protams:)
      es tikai piedāvāju vienu no daudziem variantiem kā ērtāk menedžēt šos procesus:)

    6. defektologson 14 Jan 2009 at 14:56

      */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.

    7. defektologson 14 Jan 2009 at 14:57

      Es biju domājis – ik pa 30 sekundēm.

    8. NBDon 14 Jan 2009 at 18:13

      defektologs, pēc RTFM tas būs katras 30 minūtes.

    9. defektologson 15 Jan 2009 at 12:31

      Atvainojos, Tev taisnība.

    10. marcison 19 Jan 2009 at 18:09

      cronā jau pa sekundēm nevarēs gan izsaukt neko, jo mazākais solis ir 1 minūte

    11. juriicon 05 May 2009 at 04:30

      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…

    Trackback URI | Comments RSS

    Iekomentēt