Frage Was bedeutet / bin / bash -c in der Serviceeinheit?


Um meine App während des Neustarts automatisch starten zu lassen.

sudo vi /etc/systemd/system/app.service

[Unit]
Description=app
After=network.target

[Service]
ExecStart=/usr/bin/python /usr/local/bin/app  
[Install]
WantedBy=multi-user.target


sudo systemctl daemon-reload
sudo systemctl enable app.service

Jetzt läuft meine App während des Neustarts automatisch.
Ich möchte, dass meine App alle Ausgabe-Informationen in /var/log/app.log schreibt.
Hier ist was ich tue.
1.sudo touch /var/log/app.log
2. um nur ExecStart zu ändern.

ExecStart=/usr/bin/python /usr/local/bin/app   > /var/log/app.log 2>&1

App kann ausgeführt werden, aber kein Protokoll in /var/log/app.log geschrieben.
Root führt die App aus.
Es ist Beweis hier.

ps aux|grep  app
root       246  0.0  3.8  56052 10056 ?        Ss   00:57   0:00 /usr/bin/python /usr/local/bin/app   > /var/log/app.log 2>&1

Warum hat root keine Berechtigung zum schreiben loggen Sie sich in /var/log/app.log ein?

Um die ExecStart-Anweisung in zu ändern

ExecStart=/bin/sh -c '/usr/bin/python /usr/local/bin/app   > /var/log/app.log 2>&1'  

Problem gelöst.
1. Warum root keine Berechtigung zum Schreiben in /var/log/app.log anmelden?
2. Was bedeutet / bin / bash -c in der Serviceeinheit?


5
2018-05-04 02:34


Ursprung


Für die Zukunft, bitte posten Komplett Befehle, um richtige Antworten zu erhalten. Es gibt einen großen Unterschied zwischen Ihrem ursprünglichen Beitrag und dem, was später bearbeitet wurde. Wir können uns nur mit Fragen beschäftigen, die klar und vollständig sind, und Teilbeiträge führen nur zu teilweise gültigen Antworten - Sergiy Kolodyazhnyy


Antworten:


HINWEIS: Die alte Post wurde im Zusammenhang mit der ursprünglichen Frage von OP geschrieben, Vor bearbeiten, so ist es unvollständig, aber im Kontext dessen, was ursprünglich gefragt wurde, ist es immer noch gültig.

Aktualisierte Antwort:

Das Hauptproblem hier ist, dass

ExecStart=/usr/bin/python /usr/local/bin/app   > /var/log/app.log 2>&1

Shell läuft nicht, also dein > und 2>&1 Umleitung wird von Systemd nicht verstanden.

Aus diesem Grund ist Shell um den gesamten Befehl herum notwendig, damit die Umleitung funktionieren kann. Wie für -c Flag für Shell, siehe die alte Version des Posts unten.


ALTER POST

Das -c Flagge in beiden bash und sh Das gleiche gilt für die Ausführung von Befehlen, die in den Anführungszeichen enthalten sind. Es gibt kein großes Geheimnis.

Ihre App, die Sie ausführen möchten, hat möglicherweise eine andere Bedeutung für das Flag -c. Nehmen Sie daher nicht an, dass alle Befehlszeilen-Flags für alle Befehle gleich sind. Ohne Dokumentation für die App ist es schwer zu sagen, was eine Option tun soll.

Ein potenzielles Problem besteht darin, dass der Python-Interpreter -c als eigenes Befehlszeilenargument akzeptiert und nicht zur App. Wahrscheinlich ist das der Hauptgrund, warum Ihr Befehl fehlschlägt.

Das ExecStart=/usr/bin/python /usr/local/bin/app -c /etc/app.json sollte in der Lage sein, deinen Befehl zu verarbeiten. Ich habe es mit einem kleinen Skript getestet:

$ cat test_script.py
import sys
print sys.argv[1],sys.argv[0]
$ python test_script.py this is a test                
this test_script.py

Besserer Ansatz: Ein Skript sollte mit ausführbar gemacht werden sudo chmod +x /usr/local/bin/app und selbst benutzt. Wie es ursprünglich geschrieben wurde, mit / bin / sh, dann python, dann ist das Aufrufen des eigentlichen Skripts überflüssig. Im Beispiel meines Testskripts wäre das so:

$ cat test_script.py                                  
#!/usr/bin/env python
import sys
print sys.argv[1],sys.argv[0]
$ chmod +x test_script.py
$ ./test_script.py this is a test
this ./test_script.py

Pass auf das auf python bezieht sich auf Python 2.7 auf Ubuntu. Wenn Sie Python3 speziell verwenden müssen, verwenden Sie stattdessen / usr / bin / python3. Am meisten bevorzugten Weg ist für die App zu haben #!/usr/bin/env python oder #!/usr/bin/env python3 als erste Zeile.


2
2018-05-04 02:43



Ich schreibe Post entsprechend der realen Umgebung um, um es klarer zu machen. - it_is_a_literature


Es ist keine Frage der Berechtigungen. Es ist einfach keine Shell in die Ausführung der ExecStart Zeichenfolge. Nur ein Befehl und die Optionen, die an diesen Befehl übergeben werden, aber weder Umleitungen noch Piping, noch Konkaten mit ; noch Substitution oder andere Shell-Funktionalität. So werden Ihre "Weiterleitungen" als Optionen an Ihre App weitergegeben (nur Sie wissen, wie Ihre App das handhabt).

Sie können dies ändern, indem Sie eine Shell aufrufen und Ihren Befehl und die Umleitungen als Befehlszeichenfolge an die Shell übergeben. Dies ist, was die -c Option tut es.

Aber denken Sie darüber nach, warum Sie die Dienste und die Protokollierung nicht wie von systemd beabsichtigt verwenden: Standardmäßig werden stdout und stderr einer Systemeinheit an syslog gesendet. Sie können es mit dem konfigurieren StandardOutput=Linie in Ihrem Dienst. Schau es dir an man systemd.exec


3
2018-05-04 05:59





sudo vi /etc/systemd/system/app.service

[Unit]
Description=app
After=network.target

[Service]
ExecStart=/usr/bin/python /usr/local/bin/app  
StandardOutput=journal
StandardError=journal
[Install]
WantedBy=multi-user.target

sudo systemctl daemon-reload
sudo systemctl aktivieren app.service

Um das Protokoll der App mit dem Journal-Befehl zu durchsuchen.

sudo journalctl  -u  app

1
2018-05-04 07:43