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.

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


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.


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.
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.