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.
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.
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.
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
.
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.
Fügen Sie zur Vereinfachung einen Hashbang oben in Ihr ExecStart-Skript ein, d. H.
#!/bin/bash
python -u alwayson.py
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.