
Die von mir verwendete Crontab ist komplexer, aber ich habe das Problem auf einen minimalen Problemsatz heruntergebrochen.
Meine Crontab funktioniert folgendermaßen:
mypath='/home/user/opt/script_home'
myscript='/home/user/opt/script_home/myscript.py'
* * * * * "$myscript"
Aber nicht so:
mypath='/home/user/opt/script_home'
myscript="${mypath}/myscript.py"
* * * * * "$myscript"
Fehlermeldung im Maildir:
/bin/sh: ${mypath}/myscript.py: No such file or directory
Der Python-Interpreter ist unter dem eingeschränkten Cron $PATH verfügbar, das ist also nicht das Problem.
Bearbeiten: Auch wenn ich die Crontab mit Bash oder Sh ausführe, läuft sie ohne Fehler. (Natürlich nach dem Entfernen von * * * * *)
Es kann sein, dass ich hier etwas ganz Grundlegendes übersehe, aber ich habe mich schon seit einiger Zeit damit beschäftigt und im Internet gesucht. Bisher hatte ich mit meinen Suchparametern jedoch kein Glück. Die Crontab arbeitet mit der hässlichen Verwendung des gemeinsamen Pfads an mehreren Stellen, aber das ist kein guter Code und stört mich daher. Bitte helft mir aus meiner Qual =)
Antwort1
TL;DR: das kannst du nicht.
entsprechendman 5 crontab
Der Wertestring wird nicht auf Umgebungssubstitutionen oder Variablenersetzungen analysiert, daher Zeilen wie
PATH = $HOME/bin:$PATH
wird nicht wie erwartet funktionieren.
cron
Der Parser von ist nicht so leistungsfähig wie bash
der von .
Antwort2
Sie können diese Variable „mypath“ in der Datei .bash_profile oder .bashrc konfigurieren, dann ist sie zugänglich.
vi .bash_profile or vi .bashrc
Fügen Sie dann den folgenden Pfad hinzu und speichern Sie
mypath='/home/user/opt/script_home'
Antwort3
Da cron weder eine interaktive noch eine Login-Shell ist, werden weder .bashrc noch .bash_profile als Quelle verwendet. Wenn Sie also mypath in diesen Dateien definieren, haben Sie diese Variable bei der Verwendung von cron nicht. Meines Wissens besteht die einzige Möglichkeit, sie in cron zu haben, darin, sie direkt (d. h. ohne Umgebungssubstitutionen oder Ersetzung von Variablen, wie bereits erwähnt) im Crontab-Skript zu definieren.