[LINUX] Wenn ich den Dienst mit systemd starte, wird der Befehl nicht gefunden, obwohl der Pfad übergeben wird

Das Problem, das Sie haben

Annahme

Ich versuche, einen Django-Server mit Nginx + uWSGI unter Ubuntu 18.04 auf einer Instanz von Amazon EC2 einzurichten.

** Verschiedene Versionen ** Nginx: 1.14.0 uWSGI: 2.0.18 Python: 3.7.5 Django: 2.2.11

Um uWSGI zu starten, habe ich zunächst die folgende Datei mit dem Namen uwsgi-hogehoge.service erstellt.

[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 enthält den Prozess zum Starten von uwsgi.

Und was passierte

Ich habe eine Servicedatei erstellt, um uWSGI und Nginx zu starten und einen symbolischen Link auf systemd zu setzen. Und

$ systemctl start uwsgi-hogehoge.service

Wenn ich versuche, den Dienst mit zu starten, ist dies anscheinend nicht möglich, soweit ich den Status sehen kann.

$ journalctl -xe

Als ich das Protokoll mit überprüfte, wurde der folgende Fehler angezeigt.

uwsgi: command not found

Was ich bestätigt habe

・ Der Uwsgi-Pass ist normal. -Es ist kein Fehler in Bezug auf Berechtigungen wie Berechtigungen.

Aus dem oben Gesagten geht hervor, dass der Pfad von uwsgi normalerweise übergeben wird, aber ich habe die Hypothese in Frage gestellt, dass der Pfad von systemd nicht nur übergeben wird, wenn er als Startbefehl ausgeführt wird.

Lösung

Immerhin steckt in allem ein großer Vorfahr. Ich fand den folgenden Artikel von Gott und löste alles.

Lassen Sie systemd Benutzerumgebungsvariablen lesen

Zitat aus dem obigen Artikel

Als ich nachgeschlagen habe, befand sich systemd in .barshrc und .bash_profile Ich habe festgestellt, dass die von mir definierten Umgebungsvariablen nicht gelesen wurden.

Es scheint, dass ...

Was ich getan habe, um zu lösen

$ echo $PATH

Zeigen Sie den Pfad mit an. Dann

/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

Es wurde so angezeigt. Dann habe ich ein sysconfig-Verzeichnis in / etc erstellt und eine Datei mit einem geeigneten Namen erstellt. In meinem Fall war ich ein Benutzer namens Ubuntu, daher habe ich den Dateinamen in Ubuntu geändert. Dann habe ich die Ubuntu-Datei wie folgt bearbeitet.

# 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_

Legen Sie als Nächstes den Pfad zu der Datei fest, die Sie zuvor in der Datei uwsgi-hogehoge.service erstellt haben.

[Unit]
Description=uWSGI service for mysite

[Service]
User=ubuntu
EnvironmentFile=/etc/sysconfig/ubuntu <--- Hier hinzufügen! !!
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

Jetzt können Sie die Umgebungsvariablen richtig lesen, wenn Sie den Dienst mit systemd starten.

$ systemctl daemon-reload

Laden Sie das Service-Datei-Update ordnungsgemäß und erneut

$ systemctl start uwsgi-hogehoge

Diesmal hat es richtig angefangen.

Recommended Posts

Wenn ich den Dienst mit systemd starte, wird der Befehl nicht gefunden, obwohl der Pfad übergeben wird
[Super-Anfänger] [Müde Mittelstufe] Wenn "Befehl nicht gefunden" oder "Befehl nicht gefunden" angezeigt wird
Eine Geschichte, wenn ein Verzeichnis mit dem Befehl django-admin start project in einer virtuellen Umgebung mit Pipenv fehlerhaft ist
Der Befehl wird in sudo nicht gefunden
Wenn Sie versuchen, das mit pip installierte Jupyter-Notebook zu starten und "Befehl nicht gefunden" angezeigt wird, können Sie den PATH anscheinend durchgehen.
Ich erhalte einen Python No-Modul mit dem Namen 'Encodings' mit dem Befehl aws
VS Code friert ein und der PC stürzt ab, wenn der Server mit go gestartet wird
Ich erhalte den Fehler ~ ist Null, Singular U, wenn eine verteilte, gemeinsam verteilte Matrix von der linearen Schicht an MultivariateNormal übergeben wird
Wenn ich versuche, django und postgresql mit Docker zu verbinden, wird die Fehlermeldung "django.db.utils.OperationalError: Hostname" db "konnte nicht in Adresse übersetzt werden: Name oder Dienst nicht bekannt"
Rufen Sie den Pfad zur systemd-Einheitendatei ab
Ich möchte den Pfad des Verzeichnisses abrufen, in dem die laufende Datei gespeichert ist.
Wenn das von rsyslog erfasste Protokoll nach der Drehung mit logrotate nicht aktualisiert wird