Det verkar som om du försöker starta långa processer från en webbserver och sedan spåra dessa processer i en databas. Det är inte omöjligt, men inte en rekommenderad praxis.
Huvudproblemet är att en HTTP-förfrågan för närvarande måste hanteras i din webbserver för att du faktiskt gör vad som helst (inklusive spåra processer som körs på systemet) -- du behöver något som kan köras hela tiden...
Istället skulle en bättre idé vara att låta en annan demoniserad "hanterare"-process (som du nämner perl, det skulle vara ett bra språk att skriva det på) skapa och spåra de långvariga uppgifterna (med PID och signaler), och för det process för att uppdatera din SQL-databas.
Du kan sedan låta din "manager"-process lyssna efter förfrågningar om att starta en ny process från din webbserver. Det finns olika IPC-mekanismer du kan använda. (t.ex. signaler, SysV shm, unix-domänsockets, pågående köer som ZeroMQ, etc).
Detta har flera fördelar:
- Om dina skapade skript behöver köras med användar-/gruppbaserad isolering (antingen från systemet eller från varandra), behöver din webbserver inte köras som root, och inte heller vara setgid.
- Om en skapad process "kraschar", kommer en signal att levereras till "manager"-processen, så att den kan spåra felkörningar utan problem.
- Om du använder pågående köer (t.ex. ZeroMQ) för att leverera förfrågningar till "manager"-processen, kan den "strypa" förfrågningar från webbservern (så att användare inte avsiktligt eller oavsiktligt kan orsaka D.O.S).
- Oavsett om den skapade processen slutar bra eller inte, behöver du ingen "aktiv" HTTP-förfrågan till webbservern för att uppdatera din spårningsdatabas.
Om något som bör be running är löpning, det är verkligen upp till din semantik. (dvs:är det baserat på en känd körtid? baserat på förbrukad data? etc).
Kontrollen om det är löpning kan vara tvåfaldig:
- "Manager"-processen uppdaterar databasen efter behov, inklusive det skapade PID.
- Din webbserver-värdade kod kan faktiskt lista processer för att avgöra om PID i databasen är faktiskt igång, och till och med hur mycket tid den har gjort något användbart!
Kontrollera om det är inte löpning måste baseras på konvention:
- Ge de skapade processerna något du kan förutsäga.
- Få en processlista för att avgöra vad som fortfarande körs (nedlagt?) som inte borde vara det.
I båda fallen kan du antingen informera användarna som begärde att processerna ska skapas och/eller faktiskt göra något åt det.
Ett tillvägagångssätt kan vara att ha ett CRON-jobb som läser från SQL-databasen och gör ps
för att avgöra vilka skapade processer som måste startas om, och begär sedan på nytt att "manager"-processen gör det med samma IPC-mekanism som används av webbservern. Hur du skiljer mellan start och omstart i din spårning/övervakning/loggning är upp till dig.
Om själva servern tappar ström eller kraschar, kan du låta "hanterar"-processen utföra rensning när den körs första gången, t.ex.:
- Leta efter poster i databasen för skapade processer som påstås ha körts innan servern stängdes av.
- Sök efter dessa processer efter PID och körtid (detta är viktigt).
- Antingen återskapa de skapade processerna som inte slutfördes eller lagra något i databasen för att indikera för webbservern att så var fallet.
Uppdatering #1
Enligt din kommentar, här är några tips för att komma igång:
Du nämnde perl, så förutsatt att du har viss kompetens där -- här är några perl-moduler som hjälper dig på vägen till att skriva "manager"-processskriptet:
Om du inte redan är bekant med det CPAN är arkivet för perl-moduler som gör i princip vad som helst.
Daemon::Daemonize - För att demonisera processen så att den fortsätter att köras efter att du loggat ut. Tillhandahåller även metoder för att skriva skript för att starta/stoppa/starta om demonen.
Proc::Spawn
- Hjälper till med att "skapa" underordnade skript. Gör i princip fork()
sedan exec()
, men hanterar också STDIN/STDOUT/STDERR (eller till och med tty) av underordnad process. Du kan använda detta för att starta dina långvariga perl-skript.
Om gränssnittskoden för din webbserver inte redan är skriven i perl, behöver du något som är ganska portabelt för att skicka meddelanden mellan processer och köa; Jag skulle förmodligen göra din webbservers gränssnitt i något som är lätt att distribuera (som PHP).
Här är två möjligheter (det finns många). mer):
- Perl och PHP implementeringar för Spread Toolkit .
- Perl och PHP implementeringar för ZeroMQ bibliotek.
Proc::ProcessTable - Du kan använda den här kontrollen för att köra processer (och få alla typer av statistik som diskuterats ovan).
Time::HiRes - Använd tidsfunktionerna med hög granularitet från det här paketet för att implementera ditt "throttling"-ramverk. Begränsa i princip bara antalet förfrågningar du ställer ut i kö per tidsenhet.
DBI (med mysql ) - Uppdatera din MySQL-databas från "manager"-processen.