[LINUX] Lorsque je démarre le service avec systemd, j'obtiens une commande introuvable même si le chemin passe

Le problème que vous rencontrez

supposition

J'essaie de configurer un serveur Django avec Nginx + uWSGI sur Ubuntu 18.04 sur une instance d'Amazon EC2.

** Différentes versions ** Nginx: 1.14.0 uWSGI: 2.0.18 Python: 3.7.5 Django: 2.2.11

Tout d'abord, pour démarrer uWSGI, j'ai créé le fichier suivant appelé uwsgi-hogehoge.service.

[Unit]
Description=uWSGI service for mysite

[Service]
User=ubuntu
ExecStart=/bin/bash -c 'sh /hogehoge/start.sh'
ExecStartPre=/bin/bash -c 'sh /hogehoge/start_pre.sh'
Restart=always
KillSignal=SIGQUIT
Type=notify
StandardError=syslog
NotifyAccess=all

[Install]
WantedBy=multi-user.target

start.sh contient le processus pour démarrer uwsgi.

Et ce qui est arrivé

J'ai créé un fichier de service pour démarrer uWSGI et Nginx et mettre un lien symbolique sur systemd. Et

$ systemctl start uwsgi-hogehoge.service

Lorsque j'essaie de démarrer le service avec, apparemment, ce n'est pas possible pour autant que je puisse voir l'état.

$ journalctl -xe

Lorsque j'ai vérifié le journal avec, l'erreur suivante s'est affichée.

uwsgi: command not found

Ce que j'ai confirmé

・ La passe uwsgi est normale. -Ce n'est pas une erreur liée aux autorisations telles que les autorisations. -Même s'il y a une erreur autour de l'autorité en premier lieu, l'autorité appropriée est donnée au fichier et à l'utilisateur.

D'après ce qui précède, il semble que le chemin d'uwsgi soit normalement passé, mais j'ai remis en question l'hypothèse selon laquelle le chemin de systemd n'est pas transmis uniquement lorsqu'il est exécuté en tant que commande de démarrage.

Solution

Après tout, il y a un grand ancêtre dans tout. J'ai trouvé l'article de Dieu suivant et j'ai tout résolu.

Faire en sorte que systemd lise les variables d'environnement utilisateur

Citant l'article ci-dessus

Quand je l'ai recherché, systemd était en .barshrc et .bash_profile J'ai trouvé qu'il ne lisait pas les variables d'environnement que j'avais définies.

Il paraît que ...

Ce que j'ai fait pour résoudre

$ echo $PATH

Affichez le chemin avec. Puis

/home/ubuntu/.local/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/snap/bin:/home/ubuntu/.local/bin

C'était affiché comme ça. Ensuite, j'ai créé un répertoire sysconfig dans / etc et créé un fichier avec un nom approprié. Dans mon cas, j'étais un utilisateur nommé ubuntu, j'ai donc changé le nom de fichier en ubuntu. Ensuite, j'ai édité le fichier ubuntu comme suit.

# cat <_EOF_ > /etc/sysconfig/ubuntu
PATH=/home/ubuntu/.local/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/snap/bin:/home/ubuntu/.local/bin/usr/local/bin
_EOF_

Ensuite, définissez le chemin d'accès au fichier que vous avez créé précédemment dans le fichier uwsgi-hogehoge.service.

[Unit]
Description=uWSGI service for mysite

[Service]
User=ubuntu
EnvironmentFile=/etc/sysconfig/ubuntu <--- Ajoutez ici! !!
ExecStart=/bin/bash -c 'sh /hogehoge/start.sh'
ExecStartPre=/bin/bash -c 'sh /hogehoge/start_pre.sh'
Restart=always
KillSignal=SIGQUIT
Type=notify
StandardError=syslog
NotifyAccess=all

[Install]
WantedBy=multi-user.target

Vous pouvez maintenant lire correctement les variables d'environnement lorsque vous démarrez le service avec systemd.

$ systemctl daemon-reload

Chargez la mise à jour du fichier de service correctement et encore

$ systemctl start uwsgi-hogehoge

Cette fois, ça a commencé correctement.

Recommended Posts

Lorsque je démarre le service avec systemd, j'obtiens une commande introuvable même si le chemin passe
[Super débutant] [Intermédiaire fatigué] Lorsque "commande non trouvée" ou "commande non trouvée" s'affiche
Une histoire quand un répertoire est bogué avec la commande django-admin start project dans un environnement virtuel utilisant Pipenv
La commande est introuvable dans sudo
Si vous essayez de démarrer le notebook jupyter installé avec pip et qu'il dit "commande introuvable", il semble que vous puissiez passer par le PATH.
J'obtiens une erreur Python No module nommée'encodings 'avec la commande aws
VS Code se bloque et le PC se bloque lors du lancement du serveur avec go
J'obtiens une erreur ~ est zéro, U singulier lors du passage d'une matrice distribuée co-distribuée de la couche linéaire à MultivariateNormal
Lorsque j'essaye de connecter django et postgresql avec Docker, j'obtiens l'erreur "django.db.utils.OperationalError: impossible de traduire le nom d'hôte" db "en adresse: Nom ou service inconnu"
Obtenez le chemin d'accès au fichier d'unité systemd
Je veux obtenir le chemin du répertoire où le fichier en cours d'exécution est stocké.
Lorsque le journal acquis par rsyslog n'est pas mis à jour après la rotation avec logrotate