[RAILS] Apparemment, les variables d'environnement sont différentes lors de l'exécution de sidekiq en tant que service sur le serveur de production

Aperçu

Lorsque j'ai lancé sidekiq en tant que service avec systemd sur EC2 d'AWS, le phénomène selon lequel la variable d'environnement PATH pour la commande Python que j'aurais dû passer ne fonctionnait pas s'est produit, alors je l'ai étudié.

Sondage

À la suite de l'insertion de whoami et de commandes pour vérifier les variables d'environnement à divers endroits du code J'ai remarqué que le paramètre de démarrage du service sidekiq est suspect car l'utilisateur exécutant le travail sidekiq et le contrôleur recevant la demande POST sont différents.

À propos, dans Rspec et l'environnement local, le travail qui a échoué dans sidekiq était entièrement vert, probablement parce que la variable d'environnement était efficace pour l'utilisateur exécutant.

Au fait, qu'est-ce que Systemd? </ strong> Cet article a été utile lorsque j'ai fait le tour.

Premiers pas avec Systemd https://qiita.com/bluesDD/items/eaf14408d635ffd55a18

approche

J'ai décidé de réécrire les paramètres dans le fichier sidekiq.service de systemd.

fichier systemd sidekiq.service

Ajout de ExecStartPre pour exécuter un script shell qui lit les variables d'environnement.

/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

・ ・ ・(Omission)・ ・ ・

[Install]
WantedBy=multi-user.target

Script Shell à exécuter avec ExecStartPre

Après avoir lu .bash_profile dans la source ou paramétré les variables d'environnement d'une manière ou d'une autre comme l'exportation, rendez les mêmes variables d'environnement disponibles dans systemd avec set-environment de systemctl.

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


source /home/ec2-user/.bash_profile

#Appliquer des variables d'environnement à systemd
/bin/systemctl set-environment PYENV_ROOT="$PYENV_ROOT"
/bin/systemctl set-environment PATH="$PATH"

#Processus de paramétrage lié à Python
pyenv global 3.8.3
eval "$(pyenv init -)"

#Écrivez les variables d'environnement définies à ce stade dans un fichier journal arbitraire.(Pour le débogage)
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

Redémarrage du service

systemctl daemon-reload 
systemctl restart sidekiq.service

Si l'état du service est actif et que la description Process ExecStartPre correspond au paramètre, le paramètre est réussi. Après cela, exécutez l'application et vérifiez.

[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

Apparemment, les variables d'environnement sont différentes lors de l'exécution de sidekiq en tant que service sur le serveur de production
Lorsqu'il y a des variables d'environnement dans les tests Java
Exécutez autossh en tant que service systemd sur CentOS