it-swarm.com.de

Beheben eines Systemd-Dienstes 203/EXEC-Fehler (keine solche Datei oder ein solches Verzeichnis)

Ich versuche, einen einfachen systemd-Timer einzurichten, um jeden Tag um Mitternacht ein Bash-Skript auszuführen.

systemctl --user status backup.service schlägt fehl und protokolliert Folgendes:

backup.service: Failed at step EXEC spawning /home/user/.scripts/backup.sh: No such file or directory.

backup.service: Main process exited, code=exited, status=203/EXEC
Failed to start backup.
backup.service: Unit entered failed state.
backup.service: Failed with result 'exit-code'.

Ich bin verloren, da die Dateien und Verzeichnisse existieren. Das Skript ist ausführbar, und um es zu überprüfen, habe ich sogar Berechtigungen für 777 festgelegt.

Einige hintergrund:

Die Einheitendateien backup.timer und backup.service befinden sich in /home/user/.config/systemd/user.

backup.timer ist geladen und aktiv und wartet derzeit auf Mitternacht.

So sieht es aus:

[Unit]
Description=Runs backup at 0000

[Timer]
OnCalendar=daily
Unit=backup.service

[Install]
WantedBy=multi-user.target

Hier ist backup.service:

[Unit]
Description=backup

[Service]
Type=oneshot
ExecStart=/home/user/.scripts/backup.sh

[Install]
WantedBy=multi-user.target

Und zum Schluss ist dies eine Umschreibung von backup.sh:

#!/usr/env/bin bash

rsync -a --delete --quiet /home/user/directory/ /mnt/drive/directory-backup/

Das Skript läuft gut, wenn ich es selbst ausführe.

Nicht sicher, ob es wichtig ist, aber ich verwende fish als Shell (gestartet von .bashrc).

Gerne poste ich das komplette Skript, wenn es hilfreich ist.

25
dwrz

Ich glaube, ich habe die Antwort gefunden:

In der Datei .service musste ich /bin/bash vor dem Pfad zum Skript hinzufügen.

Zum Beispiel für backup.service:

ExecStart=/bin/bash /home/user/.scripts/backup.sh

Im Gegensatz zu:

ExecStart=/home/user/.scripts/backup.sh

Ich bin mir nicht sicher warum. Vielleicht fish. Auf der anderen Seite habe ich ein anderes Skript für meine E-Mail, und die Servicedatei scheint ohne /bin/bash gut zu laufen. Es verwendet jedoch default.target statt multi-user.target.

Die meisten Tutorials, auf die ich gestoßen bin, haben /bin/bash nicht vorangestellt, aber dann sah ich diese SO - Antwort, die es hatte und dachte, es sei einen Versuch wert.

Die Servicedatei führt das Skript aus, und der Zeitgeber ist in systemctl --user list-timers aufgeführt, sodass dies hoffentlich funktioniert.

Update: Ich kann bestätigen, dass jetzt alles funktioniert.

63
dwrz

Als mir das passierte, lag es daran, dass mein Skript DOS-Endungen hatte, was immer die Shebang-Zeile am Anfang des Skripts durcheinander bringt. Ich habe es in Unix-Zeilenenden geändert und es hat funktioniert.

5
ke4ukz

Wenn dies ein Kopieren/Einfügen aus Ihrem Skript ist, haben Sie diese Zeile permutiert:

#!/usr/env/bin bash

Da ist kein #!/usr/env/bin, du meintest #!/usr/bin/env.

2
Ivan Savcic

Ich habe die Antwort tatsächlich aus Wie kann ich eine node.js-App als Hintergrunddienst ausführen? kombiniert mit dem, was dwrz oben gesagt hat. In meinem Fall erstellte ich einen Discord-Bot, der ausgeführt werden musste, wenn ich nicht da war.

Mit diesem Service erhielt ich zunächst den gleichen Fehler wie das ursprüngliche Poster, das mich hierher brachte. Mir fehlte der #!/usr/bin/env node oben in meinem ausgeführten node.js-Skript.

Seitdem keine Probleme, obwohl ich vor Augen habe, was sonst noch auf den Dienst selbst erweitert werden kann.

1
Wirehead

Fügen Sie zur Vereinfachung einen Hashbang oben in Ihr ExecStart-Skript ein, d. H.

#!/bin/bash

python -u alwayson.py    
0
crizCraig

Ich lief über ein Main process exited, code=exited, status=203/EXEC auch heute und mein Fehler war, dass ich vergessen habe, das ausführbare Bit zur Datei hinzuzufügen.

0
Karl Pokus