Jak monitorować opóźnione zadanie za pomocą monit
Czy są jakieś przykłady w sieci jak monitorować delayed_job za pomocą Monit?
Wszystko, co mogę znaleźć, używa Boga , ale odmawiam używania Boga, ponieważ długotrwałe procesy w Rubim są generalnie do bani. (Najbardziej aktualny post na liście dyskusyjnej Boga? Użycie Pamięci Boga Stale Rośnie .)
Update: delayed_job teraz zawiera przykładową konfigurację monit opartą na tym pytaniu.
13 answers
Oto Jak to działa.
- użyj widelca collectiveidea delayed_job poza tym, że jest aktywnie utrzymywana, ta wersja ma ładny Demon
script/delayed_job
, którego możesz używać z monit. Railscasts ma dobry odcinek o tej wersjidelayed_job
(Wersja ASCIICasts ). Ten skrypt ma również kilka innych fajnych funkcji, takich jak możliwość uruchamiania wielu pracowników. Nie pokrywam tego tutaj. - zainstaluj monit. Zainstalowałem ze źródła bo Ubuntu wersja jest tak śmiesznie nieaktualna. Wykonałem te instrukcje, aby uzyskać standardowy init.Skrypty d, które pochodzą z pakietów Ubuntu. Musiałem również skonfigurować za pomocą
./configure --sysconfdir=/etc/monit
, więc został pobrany standardowy katalog konfiguracji Ubuntu. -
Napisz skrypt monit. Oto co wymyśliłem:
check process delayed_job with pidfile /var/www/app/shared/pids/delayed_job.pid
start program = "/var/www/app/current/script/delayed_job -e production start"
stop program = "/var/www/app/current/script/delayed_job -e production stop"
Przechowuję to w moim systemie sterowania soucre i wskazuję monit na to za pomocą
include /var/www/app/current/config/monit
w pliku/etc/monit/monitrc
. - Konfiguracja monit. te instrukcje są pełne reklam, ale poza tym OK.
- napisz zadanie dla capistrano, aby zatrzymać i rozpocząć.
monit start delayed_job
imonit stop delayed_job
to jest to, co chcesz uruchomić. Przeładowuję również monit podczas wdrażania, aby odebrać wszelkie zmiany w pliku konfiguracyjnym.
Problemy, na które wpadłem:
-
daemons
gem musi być zainstalowany do uruchomieniascript/delayed_job
. - musisz przekazać środowisko Rails do
script/delayed_job
za pomocą-e production
(na przykład). Jest to udokumentowane w pliku README, ale nie w wyjście pomocy skryptu. - używam Ruby Enterprise Edition, więc potrzebowałem monit, aby zacząć od tej kopii Rubiego. Ze względu na sposób, w jaki sudo obsługuje ścieżkę W Ubuntu, zakończyłem symlinkowanie
/usr/bin/ruby
i/usr/bin/gem
do wersji REE.
Podczas debugowania monit, odkryłem, że pomaga zatrzymać init.wersja d i uruchomić go z linii poleceń th, dzięki czemu można uzyskać komunikaty o błędach. W przeciwnym razie bardzo trudno jest dowiedzieć się, dlaczego rzeczy idą źle.
sudo /etc/init.d/monit stop
sudo monit start delayed_job
Mam nadzieję, że to pomoże następnej osobie, która chce monitorować monit.Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-23 12:16:55
Jeśli to coś warte, zawsze możesz użyć /usr/bin/env z monit do konfiguracji środowiska. Jest to szczególnie ważne w bieżącej wersji delayed_job, 1.8.4, gdzie opcja environment (- e) jest przestarzała.
check process delayed_job with pidfile /var/app/shared/pids/delayed_job.pid
start program = "/usr/bin/env RAILS_ENV=production /var/app/current/script/delayed_job start"
stop program = "/usr/bin/env RAILS_ENV=production /var/app/current/script/delayed_job stop"
W niektórych przypadkach może być również konieczne ustawienie ścieżki za pomocą env.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-11-12 14:55:31
Okazało się, że łatwiej jest stworzyć skrypt init dla opóźnionego zadania. Jest on dostępny tutaj: http://gist.github.com/408929 lub poniżej:
#! /bin/sh set_path="cd /home/rails/evatool_staging/current" case "$1" in start) echo -n "Starting delayed_job: " su - rails -c "$set_path; RAILS_ENV=staging script/delayed_job start" >> /var/log/delayed_job.log 2>&1 echo "done." ;; stop) echo -n "Stopping sphinx: " su - rails -c "$set_path; RAILS_ENV=staging script/delayed_job stop" >> /var/log/delayed_job.log 2>&1 echo "done." ;; *) N=/etc/init.d/delayed_job_staging echo "Usage: $N {start|stop}" >&2 exit 1 ;; esac exit 0
Następnie upewnij się, że monit jest ustawiony na uruchomienie / ponowne uruchomienie aplikacji, więc w pliku monitrc:
check process delayed_job with pidfile "/path_to_my_rails_app/shared/pids/delayed_job.pid" start program = "/etc/init.d/delayed_job start" stop program = "/etc/init.d/delayed_job stop"I to działa świetnie!
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-05-21 14:58:23
Znalazłem fajny sposób na rozpoczęcie delayed_job z cronem na boocie. Używam kiedykolwiek do kontrolowania crona.
Mój grafik.rb:# custom job type to control delayed_job job_type :delayed_job, 'cd :path;RAILS_ENV=:environment script/delayed_job ":task"' # delayed job start on boot every :reboot do delayed_job "start" end
Uwaga: uaktualniłem kiedykolwiek gem do wersji 0.5.0, aby móc używać job_type
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-06-30 07:26:28
Nie wiem z monitem, ale napisałem kilka wtyczek Munin do monitorowania wielkości kolejki i średniego czasu wykonywania zadania. Zmiany, które wprowadziłem do delayed_job w tej łatce, mogą również ułatwić Ci pisanie wtyczek Monit na wypadek, gdybyś trzymał się tego.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-08-04 15:59:35
Dzięki za scenariusz.
Jeden, ponieważ monit z definicji ma'spartan path' z
/bin:/usr/bin:/sbin:/usr/sbin
... a dla mnie ruby został zainstalowany / połączony w /usr / local / bin, musiałem się całymi godzinami zastanawiać, dlaczego monit po cichu zawodził podczas próby ponownego uruchomienia delayed_job(nawet z-v dla trybu monit verbose).
W końcu musiałem to zrobić:
check process delayed_job with pidfile /var/www/app/shared/pids/delayed_job.pid
start program = "/usr/bin/env PATH=$PATH:/usr/local/bin /var/www/app/current/script/delayed_job -e production start"
stop program = "/usr/bin/env PATH=$PATH:/usr/local/bin /var/www/app/current/script/delayed_job -e production stop"
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-12-05 13:46:48
Jeśli monit działa jako root i chcesz uruchomić delayed_job jako my_user to zrób to:
/etc / init.d / delayed_job :
#!/bin/sh
# chmod 755 /etc/init.d/delayed_job
# chown root:root /etc/init.d/delayed_job
case "$1" in
start|stop|restart)
DJ_CMD=$1
;;
*)
echo "Usage: $0 {start|stop|restart}"
exit
esac
su -c "cd /var/www/my_app/current && /usr/bin/env bin/delayed_job $DJ_CMD" - my_user
/var / www / my_app/shared/monit / delayed_job.monitrc :
check process delayed_job with pidfile /var/www/my_app/shared/tmp/pids/delayed_job.pid
start program = "/etc/init.d/delayed_job start"
stop program = "/etc/init.d/delayed_job stop"
if 5 restarts within 5 cycles then timeout
/etc / monit / monitrc :
# add at bottom
include /var/www/my_app/shared/monit/*
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-09-30 13:32:15
Ponieważ nie chciałem uruchamiać jako root, skończyłem tworząc skrypt init bash, którego monit używał do uruchamiania i zatrzymywania (PROGNAME byłoby absolutną ścieżką do script/delayed_job):
start() {
echo "Starting $PROGNAME"
sudo -u $USER /usr/bin/env HOME=$HOME RAILS_ENV=$RAILS_ENV $PROGNAME start
}
stop() {
echo "Stopping $PROGNAME"
sudo -u $USER /usr/bin/env HOME=$HOME RAILS_ENV=$RAILS_ENV $PROGNAME stop
}
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-11-12 21:35:42
Musiałem połączyć rozwiązania na tej stronie z innym skryptem wykonanym przez toby ' ego, aby działało z monitem i zaczynało od odpowiedniego użytkownika.
Więc moja opóźniona praca.monitrc wygląda tak:check process delayed_job
with pidfile /var/app/shared/pids/delayed_job.pid
start program = "/bin/su -c '/usr/bin/env RAILS_ENV=production /var/app/current/script/delayed_job start' - rails"
stop program = "/bin/su -c '/usr/bin/env RAILS_ENV=production /var/app/current/script/delayed_job stop' - rails"
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-01-28 13:01:02
Poświęciłem sporo czasu na ten temat. Miałem dość nie posiadania dobrego rozwiązania, więc napisałem wtyczkę delayed_job_tracer, która konkretnie dotyczy monitorowania delayed_job i jego zadań.
Oto artykuł, który o nim napisałem: http://modernagility.com/articles/5-monitoring-delayed_job-and-its-jobs
Ta wtyczka będzie monitorować proces opóźnionego zadania i wysłać e-mail w przypadku awarii delayed_job lub jeśli jedno z jego zadań nie powiedzie się.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-05-26 22:32:17
Dla Rails 3, możesz potrzebować set HOME env, aby kompas działał poprawnie, a poniżej Config działa dla mnie:
check process delayed_job
with pidfile /home/user/app/shared/pids/delayed_job.pid
start program = "/bin/sh -c 'cd /home/user/app/current; HOME=/home/user RAILS_ENV=production script/delayed_job start'"
stop program = "/bin/sh -c 'cd /home/user/app/current; HOME=/home/user RAILS_ENV=production script/delayed_job stop'"
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-08-16 04:03:09
Natknąłem się na problem, w którym jeśli opóźnione zadanie umrze, gdy nadal ma zadanie zablokowane, to zadanie nie zostanie uwolnione. Napisałem skrypt owijający wokół opóźnionego zadania, który spojrzy na plik pid i uwolni wszystkie zadania od martwego pracownika.
Skrypt jest dla rubber/capistrano
Role / delayedjob/delayed_job_wrapper:
<% @path = '/etc/monit/monit.d/monit-delayedjob.conf' %>
<% workers = 4 %>
<% workers.times do |i| %>
<% PIDFILE = "/mnt/custora-#{RUBBER_ENV}/shared/pids/delayed_job.#{i}.pid" %>
<%= "check process delayed_job.#{i} with pidfile #{PIDFILE}"%>
group delayed_job-<%= RUBBER_ENV %>
<%= " start program = \"/bin/bash /mnt/#{rubber_env.app_name}-#{RUBBER_ENV}/current/script/delayed_job_wrapper #{i} start\"" %>
<%= " stop program = \"/bin/bash /mnt/#{rubber_env.app_name}-#{RUBBER_ENV}/current/script/delayed_job_wrapper #{i} stop\"" %>
<% end %>
Role / delayedjob / delayed_job_wrapper
#!/bin/bash
<% @path = "/mnt/#{rubber_env.app_name}-#{RUBBER_ENV}/current/script/delayed_job_wrapper" %>
<%= "pid_file=/mnt/#{rubber_env.app_name}-#{RUBBER_ENV}/shared/pids/delayed_job.$1.pid" %>
if [ -e $pid_file ]; then
pid=`cat $pid_file`
if [ $2 == "start" ]; then
ps -e | grep ^$pid
if [ $? -eq 0 ]; then
echo "already running $pid"
exit
fi
rm $pid_file
fi
locked_by="delayed_job.$1 host:`hostname` pid:$pid"
<%=" /usr/bin/mysql -e \"update delayed_jobs set locked_at = null, locked_by = null where locked_by='$locked_by'\" -u#{rubber_env.db_user} -h#{rubber_instances.for_role('db', 'primary' => true).first.full_name} #{rubber_env.db_name} " %>
fi
<%= "cd /mnt/#{rubber_env.app_name}-#{RUBBER_ENV}/current" %>
. /etc/profile
<%= "RAILS_ENV=#{RUBBER_ENV} script/delayed_job -i $1 $2"%>
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-01-31 03:06:58
Aby zobaczyć, co się dzieje, Uruchom monit w trybie foreground: sudo monit -Iv
Używając rvm
zainstalowanego pod użytkownikiem "www1" i grupy "www1".
W pliku /etc/monit/monitrc
:
#delayed_job
check process delayed_job with pidfile /home/www1/your_app/current/tmp/pids/delayed_job.pid
start program "/bin/bash -c 'PATH=$PATH:/home/www1/.rvm/bin;source /home/www1/.rvm/scripts/rvm;cd /home/www1/your_app/current;RAILS_ENV=production bundle exec script/delayed_job start'" as uid www1 and gid www1
stop program "/bin/bash -c 'PATH=$PATH:/home/www1/.rvm/bin;source /home/www1/.rvm/scripts/rvm;cd /home/www1/your_app/current;RAILS_ENV=production bundle exec script/delayed_job stop'" as uid www1 and gid www1
if totalmem is greater than 200 MB for 2 cycles then alert
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-01-11 20:39:11