[RAILS] Anscheinend unterscheiden sich die Umgebungsvariablen, wenn sidekiq als Dienst auf dem Produktionsserver ausgeführt wird

Überblick

Als ich sidekiq als Dienst mit systemd auf EC2 von AWS startete, trat das Phänomen, dass die Umgebungsvariable PATH für den Python-Befehl, den ich hätte übergeben sollen, nicht funktionierte, auf und untersuchte sie.

Umfrage

Als Ergebnis des Einfügens von whoami und Befehlen zum Überprüfen von Umgebungsvariablen an verschiedenen Stellen im Code Ich habe festgestellt, dass die Einstellung zum Starten des Sidekiq-Dienstes verdächtig ist, da der Benutzer, der den Sidekiq-Job ausführt, und der Controller, der die POST-Anforderung empfängt, unterschiedlich sind.

Übrigens war in Rspec und der lokalen Umgebung der Job, der in sidekiq fehlgeschlagen ist, alle grün, wahrscheinlich weil die Umgebungsvariable für den ausführenden Benutzer effektiv war.

Was ist übrigens Systemd? </ strong> Dieser Artikel war hilfreich, als ich herumging.

Erste Schritte mit Systemd https://qiita.com/bluesDD/items/eaf14408d635ffd55a18

Ansatz

Ich habe beschlossen, die Einstellungen in der sidekiq.service-Datei von systemd neu zu schreiben.

systemd sidekiq.service Datei

ExecStartPre hinzugefügt, um ein Shell-Skript auszuführen, das Umgebungsvariablen liest.

/etc/systemd/system/sidekiq.service


[Unit]
Description=sidekiq
After=syslog.target network.target

[Service]
WorkingDirectory=/var/www/hoge-app
ExecStartPre=/bin/sh /var/www/hoge-app/aws/service/sidekiq_exec_start.sh
ExecStart=/root/.rbenv/bin/rbenv exec bundle exec sidekiq -e production

・ ・ ・(Unterlassung)・ ・ ・

[Install]
WantedBy=multi-user.target

Shell-Skript zur Ausführung mit ExecStartPre

Stellen Sie nach dem Lesen von .bash_profile in der Quelle oder dem Festlegen von Umgebungsvariablen wie z. B. Exportieren dieselben Umgebungsvariablen in systemd mit set-environment von systemctl zur Verfügung.

/var/www/hoge-app/aws/service/sidekiq_exec_start.sh


source /home/ec2-user/.bash_profile

#Wenden Sie Umgebungsvariablen auf systemd an
/bin/systemctl set-environment PYENV_ROOT="$PYENV_ROOT"
/bin/systemctl set-environment PATH="$PATH"

#Python-bezogener Einstellungsprozess
pyenv global 3.8.3
eval "$(pyenv init -)"

#Schreiben Sie die an dieser Stelle festgelegten Umgebungsvariablen in eine beliebige Protokolldatei.(Zum Debuggen)
LOGFILE=/var/www/hoge-app/log/production.log
echo "Sidekiq Service Exec Start Pre --------" >> $LOGFILE
echo "$PYENV_ROOT" >> $LOGFILE
echo "$PATH" >> $LOGFILE
python -V >> $LOGFILE
whoami >> $LOGFILE
echo "-------------------------------------" >> $LOGFILE

Neustart des Dienstes

systemctl daemon-reload 
systemctl restart sidekiq.service

Wenn der Servicestatus aktiv ist und die Beschreibung von Process ExecStartPre mit der Einstellung übereinstimmt, ist die Einstellung erfolgreich. Führen Sie danach die Anwendung aus und überprüfen Sie sie.

[root@ip-*-*-*-* hoge-app]# systemctl status sidekiq.service
● sidekiq.service - sidekiq
   Loaded: loaded (/etc/systemd/system/sidekiq.service; enabled; vendor preset: disabled)
   Active: active (running) since Sat 2020-10-31 18:28:39 JST; 3s ago
  Process: 7130 ExecStartPre=/bin/sh /var/www/hoge-app/aws/service/sidekiq_exec_start.sh (code=exited, status=0/SUCCESS)
 Main PID: 7731 (bundle)
   CGroup: /system.slice/sidekiq.service
           └─7731 sidekiq 6.1.1 hoge-app [0 of 1 busy]

Recommended Posts

Anscheinend unterscheiden sich die Umgebungsvariablen, wenn sidekiq als Dienst auf dem Produktionsserver ausgeführt wird
Wenn Java-Tests Umgebungsvariablen enthalten
Führen Sie autossh als systemd-Dienst unter CentOS aus