So starten Sie eine Rechenaufgabe mit upstart

7

Ich versuche, einen Resque-Worker als Upstart-Init-Skript einzurichten, das von Monit in einer Rails-App verwendet wird. Ich bin kein Sysop und habe versucht, dies anhand von Beispielen aus einem anderen Init-Skript zu schreiben, das wir auf unserem Server haben. Folgendes habe ich:

start on startup
stop on shutdown

pre-start script
   cd /var/www/my-app/current
end script

script
   exec bundle exec rake environment resque:work RAILS_ENV=staging PIDFILE=/var/run/resque.pid QUEUE=sync >> /var/log/resque.log
end script

Aber es funktioniert nicht, wenn ich es versuche, sudo start resquebekomme ich:

resque start/running, process XXXX

Soweit ich weiß, wird nichts gestartet, es ist weder ein Resque-Prozess noch eine Protokolldatei zu finden. Ich bin ziemlich verloren, wie ich es zum Laufen bringen kann.

Update : Ich habe die Syslog-Datei gefunden und sie lautet:

Nov  4 17:20:09 fantasysports init: resque main process (3057) terminated with status 2

Update : Ich habe versucht, es mit sudo auszuführen (ja, das macht keinen Sinn!) Und die Ausgabeumleitung in die Protokolldatei entfernt. Jetzt erhalte ich einen anderen Statuscode:

Nov  4 17:29:44 fantasysports init: resque main process (3276) terminated with status 10

Update : Am Ende wurde Upstart für init.d eingestellt, da dies start-stop-daemonviel besser dokumentiert ist und ich die vollständige Kontrolle darüber habe, was los ist.

Nicolas Buduroi
quelle

Antworten:

5

Hier ist, wie ich es mache. Dies fügt auch in rvm hinzu

start on startup
stop on starting rcS

chdir /data/pusher/current
env RAILS_ENV=production
script
  /usr/local/bin/rvm-shell '1.9.2@app' -c 'JOBS_PER_FORK=25 RAILS_ENV=production QUEUE=app_production bundle exec rake --trace resque:work >> /data/app/current/log/app-worker.production.log 2>&1'
end script

Bearbeiten: Hier ist, wie ich es mache, um als ein anderer Benutzer zu laufen. Chdir scheint nicht geehrt zu werden. Also ist es irgendwie hackig

start on runlevel [2345]
stop on starting rcS

chdir /data/app/current
env RAILS_ENV=production
script
        sudo -u user -s -- "cd /data/app/current; export RAILS_ENV=production; /usr/local/bin/rvm-shell '1.9.2-p180@app' -c 'QUEUE=app_production bundle exec rake resque:work >> /data/app/current/log/app-worker.production.log 2>&1'"
end script

Sie müssen so ziemlich in das richtige Verzeichnis wechseln und RAILS_ENV im Befehl sudo festlegen

Mike
quelle
Vielen Dank, es war der Befehl cd, der das Problem verursachte! Ich wusste nichts über Chdir.
Nicolas Buduroi
Haben Sie eine Idee, wie Sie den Eigentümer des Prozesses ändern können?
Nicolas Buduroi
bearbeitete meinen Beitrag .. es könnte einen besseren Weg geben, dies zu tun ... aber das funktioniert
Mike
Ich habe einen anderen Trick gefunden, um den Benutzer zu wechseln, der vielleicht ordentlicher ist - ihn in Sudo Bash zu leiten. exec echo 'cd /home/user ; RAILS_ENV=production bundle exec ....' | sudo -u user -i bash
Mahemoff
1
Genau wie chdir DIR das Verzeichnis wechselt, gibt es auch: setuid und setgid. Siehe upstart.ubuntu.com/cookbook/#setgid
Dima
1

Das RVM-Handbuch im Abschnitt "Integration" empfiehlt für die Verwendung von RVM- und Ruby-basierten Diensten, die über init.d oder upstart gestartet werden , die Verwendung von RVM-Aliasen und -Wrappern.

Ich hatte eine Situation, in der ich einen bluepillProzess überwachen musste . Dieser Prozess ist ein Daemon, also ein Prozess, der sich zweimal teilt. Das Starten mit dem rvm-shellBefehl fügte eine dritte Verzweigung hinzu ... Dies führte dazu, dass Upstart den Prozess nicht verfolgen konnte PID( es kann Prozesse maximal nur bis zur zweiten Verzweigung verfolgen - wenn die expect daemonZeilengruppe angegeben ist ).

Ich habe das folgendermaßen gelöst:

  1. Zuerst habe ich einen RVM-Alias ​​für meine Umgebung erstellt:

    rvm alias create my_app ruby-2.0.0-p247@my_app

  2. Dann habe ich die folgende Upstart-Konfiguration für meinen Job verwendet:

`# /etc/init/bluepill_my-app.conf

description "my_app Bluepill"

start on runlevel [2]
stop on runlevel [016]

setuid my-app
setgid my-app

expect daemon
respawn

env USER=my-app
env HOME=/var/www/my-app/
env RAILS_ENV=my-app
env BLUEPILL_BASE_DIR=/tmp/bluepill_my-app

chdir /var/www/my-app/current/

exec /var/www/my-app/.rvm/wrappers/my-app/bundle exec bluepill --no-privileged load  /var/www/my-app/current/config/deploy/monitoring/my-app.pill >> /tmp/upstart.log 2>&1

`

Bundler muss in dem angegebenen Gemset installiert sein, auf das der RVM-Alias ​​verweist.

Das Aufrufen des bundlerWrapper-Skripts verursacht keine Gabeln wie der rvm-shellBefehl.

Eine Alternative könnte darin bestehen, bluepilldas Gem im verwendeten Gemset zu installieren , ein Wrapper-Skript dafür zu erstellen und es direkt ohne das Bundle Exec zu verwenden - genau wie es das RVM-Handbuch vorschlägt -, aber wenn Sie es über verwenden, bunlderkönnen die Bluepill- .pillDateien jede in my verwendete Bibliothek verwenden -app (wie setingslogicetc.).

Das ist ein bisschen vom Thema abgekommen, aber ich denke, es ist ein gutes Beispiel, wie man es besser macht. Ich hoffe das hilft.

Szymon Jeż
quelle
1
Vielen Dank Simon Sie haben das Problem gelöst, das ich seit 5 Stunden zu lösen versucht habe. Ich muss das Bundler-Gem im Gemset installieren, um Bundle Exec im Upstart mit dem Gemset ausführen zu können. Das System verwendete Bundler aus dem Standard-Gemset und konnte nicht auf die Gems zugreifen, die ich mit der Bundle-Installation installiert hatte.