Musimy użyć delayed_job (lub innego procesora działającego w tle), aby uruchomić zadania w tle, ale nie możemy zmieniać skryptów rozruchowych/rozruchowych -levels na serwerze. Oznacza to, że demon nie ma gwarancji, że pozostanie dostępny, jeśli dostawca ponownie uruchomi serwer (ponieważ demon byłby uruchamiany przez recepturę capistrano, która jest uruchamiana tylko raz dla każdego wdrożenia).Uruchom lub upewnij się, że zadanie opóźnione działa, gdy aplikacja/serwer zostanie ponownie uruchomiony.
Obecnie najlepszym sposobem, w jaki mogę zapewnić, że demon delayed_job jest zawsze uruchomiony, jest dodanie inicjalizatora do naszej aplikacji Railsowej, która sprawdza, czy demon jest uruchomiony. Jeśli nie działa, inicjator uruchamia demona, w przeciwnym razie po prostu pozostawia go.
Pytanie zatem brzmi: w jaki sposób wykryjemy, że demon Delayed_Job działa z poziomu skryptu? (Powinniśmy być w stanie dość łatwo uruchomić demona, trochę nie wiem, jak wykryć, czy ktoś jest już aktywny).
Ktoś ma jakieś pomysły?
Pozdrawiam, Bernie
Na podstawie poniższej odpowiedzi, to co wymyśliłem. Wystarczy umieścić go w config/inicjalizatorów i gotowe:
#config/initializers/delayed_job.rb
DELAYED_JOB_PID_PATH = "#{Rails.root}/tmp/pids/delayed_job.pid"
def start_delayed_job
Thread.new do
`ruby script/delayed_job start`
end
end
def process_is_dead?
begin
pid = File.read(DELAYED_JOB_PID_PATH).strip
Process.kill(0, pid.to_i)
false
rescue
true
end
end
if !File.exist?(DELAYED_JOB_PID_PATH) && process_is_dead?
start_delayed_job
end
W twojej odpowiedzi, czy nie powinniśmy również dostarczać '-e production'? – nathanvda
Korzystanie z rails3 to rozwiązanie nie działa dla mnie. Rozpoczęcie procesu jest kompletnie błędne: nadal uruchamia dodatkowe zadania. Wróciłem do zadań capistrano :) – nathanvda