Ich bin ein Neuling bei Linux und versuche, das Schreiben von Skripten und das Erstellen eigener Dienste zu üben. Ich wollte mein einfaches Redshift-Skript, das die Farbtemperatur meines Bildschirms ändert, in einen Dienst umwandeln. Das Skript funktioniert, wenn ich es im Terminal ausführe, aber wenn ich versuche, es in einer .service-Datei auszuführen, stoße ich auf ein Problem. Für jede Hilfe wäre ich dankbar.
Mein Skript (redshift.sh):
#!/bin/bash
redshift -O 1500
Beim Ausführen ./redshift.sh
sehe ich, wie sich die Farbtemperatur meines Bildschirms ändert, und erhalte die folgende Ausgabe: Using method randr
.
Mein Dienst (redshift.service):
[Unit]
Description=Set Redshift
[Service]
Type=simple
ExecStart=/bin/bash /usr/bin/redshift.sh
[Install]
WantedBy=default.target
Erwartung ist zu habenredshift.serviceführe mein Skript ausredshift.sh.
Dienst einrichten:
Ich habe die Skriptdatei kopiert /usr/bin
und den Modus auf x (ausführbar) geändert.
sudo cp redshift.sh /usr/bin/redshift.sh
sudo chmod +x /usr/bin/redshift.sh
Ich habe die Servicedatei kopiert /etc/systemd/system
und den Modus auf 644 geändert.
sudo cp redshift.service /etc/systemd/system/redshift.service
sudo chmod 644 /etc/systemd/system/redshift.service
Ich versuche, meinen Dienst auszuführen:
sudo systemctl start redshift
Die Farbtemperatur der Anzeige ändert sich nicht!
Servicestatus abrufen:
sudo systemctl status redshift
Anhand der Ausgabe von systemctl status kann ich erkennen, dass das Skript versucht hat, ausgeführt zu werden, aber es sind einige Fehler aufgetreten. Irgendwelche Ideen, warum das so sein könnte? Die Statusausgabe wird unten angezeigt.
"Loaded: loaded (/etc/systemd/system/redshift.service; disabled; vendor preset: enabled)
Active: failed (Result: exit-code) since Fri 2020-09-04 11:40:11 EDT; 8s ago
Process: 21928 ExecStart=/bin/bash /usr/bin/redshift.sh (code=exited, status=1/FAILURE)
Main PID: 21928 (code=exited, status=1/FAILURE)
Sep 04 11:40:11 labpc-ThinkPad-T540p bash[21933]: `RANDR Query Version' returned error -1
Sep 04 11:40:11 labpc-ThinkPad-T540p bash[21933]: Initialization of randr failed.
Sep 04 11:40:11 labpc-ThinkPad-T540p bash[21933]: Trying next method...
Sep 04 11:40:11 labpc-ThinkPad-T540p bash[21933]: No protocol specified
Sep 04 11:40:11 labpc-ThinkPad-T540p bash[21933]: X request failed: XOpenDisplay
Sep 04 11:40:11 labpc-ThinkPad-T540p bash[21933]: Initialization of vidmode failed.
Sep 04 11:40:11 labpc-ThinkPad-T540p bash[21933]: Trying next method...
Sep 04 11:40:11 labpc-ThinkPad-T540p bash[21933]: No more methods to try.
Sep 04 11:40:11 labpc-ThinkPad-T540p systemd[1]: redshift.service: Main process exited, code=exited, status=1/FA>
Sep 04 11:40:11 labpc-ThinkPad-T540p systemd[1]: redshift.service: Failed with result 'exit-code'."
Ich habe dieses Tutorial befolgt, um meinen Dienst zu erstellen:https://www.linode.com/docs/quick-answers/linux/start-service-at-boot/#create-a-custom-systemd-service
Antwort1
Möglicherweise müssen Sie Umgebungsvariablen wie Anzeige und Xauth festlegen.
Mein Dienst hat diese Zeile zum [service]
Abschnitt hinzugefügt
Environment="DISPLAY=:0" "XAUTHORITY=/run/user/1000/gdm/Xauthority"
Sieh dir das anFadenfür weitere Einzelheiten.
Außerdem muss der Execstart keine .sh-Datei sein. Sie können den Pfad auf die Redshift-Exec setzen (oder in Ihrem Fall den Befehl wie in einem Terminal eingeben, da Redshift vermutlich in Ihrem PATH enthalten ist).
Antwort2
Sie müssen die Anzeige als Umgebung definieren und ausführen, nachdem der Display-Manager gestartet ist.
Bitte sehen Sie sich den Inhalt unten an.
[Unit]
Description=Redshift
After=display-manager.service
[Service]
Environment=DISPLAY=:0
ExecStart=/usr/bin/redshift -O 1500
Restart=always
[Install]
WantedBy=default.target
Sie können auch Parameter definieren ExeStart
und zusätzliche benutzerdefinierte Bash-Skripte eliminieren.