
Ich habe ein Minimalbeispiel für mein Problem, nämlich den Versuch, eine Crontab zu installieren, die so aussieht:
FOO="foo\"bar\"bin"
0 0 1 * * ls
durch Ausführen crontab crontab
(ich habe es in einem Dateinamen crontab
). Es schlägt mit diesem Fehler fehl:
% crontab crontab
"crontab":0: bad minute
crontab: errors in crontab file, can't install
\"
Das Problem wird durch das maskierte Anführungszeichen verursacht.
Wie entkomme ich Anführungszeichen in den Umgebungsvariablen von Crontab?
Um etwas mehr Kontext hinzuzufügen: Ich schreibe nicht nur Variablen in eine manuell geschriebene Crontab. Diese Crontab wird generiert vonWann immer(ein Ruby-Gem), es enthält etwa 70 Einträge, nimmt alle Umgebungsvariablen auf und legt sie als Variablen in der Crontab ab, sodass alle Anmeldeinformationen für die Skripte verfügbar sind. Das Problem ist, dass ich vor kurzem ein komplexes hinzugefügt habe, das Anführungszeichen enthält, und das hat dieses System kaputt gemacht.
Falls es Sie interessiert, der Ruby-Code, der die Variablen generiert, lautet:
ENV.each do |key, value|
env key.to_sym, value.inspect
end
Antwort1
Die bewährte Vorgehensweise hierfür cron
ist:
- Erstellen Sie ein Skript zum Ausführen der Befehle
- Variablen im Skript festlegen. Es ist auch möglich, externe Dateien mit Variablen zu verwenden:
source /path/to/file/with/variables
- Vollständigen Pfad zu Befehlen verwenden
/usr/bin/ls
- Verlassen Sie sich nicht auf Ihren Benutzer-Homepage, Pfad usw.
Und hier ist ein Beispiel, wie Sie ein Shell-Skript erstellen können, das ruby
Programme in verschiedenen Umgebungen ausführt.
Sie cron
haben Datensätze wie (Beispiel):
0 1 * * * /path/script 1
0 2 * * * /path/script 2
Das Skript selbst sieht ungefähr so aus:
#!/bin/bash
a=$1
case "$a" in
1) source /path/file1
/path/to/ruby <parameters>
;;
2) source /path/file2
/path/to/ruby <parameters>
;;
<snip>
*) # do something if parameter is not enumerated
;;
esac
und file1
enthalten so etwas wie (Beispiel)
RUBYVAR1_1=1
RUBYVAR1_2=2
Undfile2
RUBYVAR2_1=12
RUBYVAR2_2=22
Antwort2
Eine aktive Zeile in einer Crontab ist entweder eine Umgebungseinstellung oder ein Cron-Befehl. Eine Umgebungseinstellung hat die Form:
name = value
wobei die Leerzeichen um das Gleichheitszeichen (=) optional sind und alle nachfolgenden nicht führenden Leerzeichen im Wert Teil des dem Namen zugewiesenen Werts sind. Die Wertzeichenfolge kann in Anführungszeichen (einfach oder doppelt, aber übereinstimmend) gesetzt werden, um führende oder nachfolgende Leerzeichen beizubehalten.
Das Einschließen Ihrer Zeichenfolge mit doppelten Anführungszeichen in einfache Anführungszeichen sollte also funktionieren
Getestet mit einer Crontab:
var = 'this"contains"quotes'
* * * * * /usr/bin/env >> /tmp/env
Es sieht so aus, als würden Ihre Anführungszeichen ordnungsgemäß in der Variable gespeichert.
cat /tmp/env
HOME=/home/HBruijn
LANG=C.UTF-8
SHELL=/bin/sh
var=this"contains"quotes
Aber ich stimme auch mit der vorherigen Antwort und Meinung überein; cron ist keine richtige Skriptumgebung, sondern nur ein veralteter Job-Scheduler mit vielen Einschränkungen, und Sie sollten alles, was nach Komplexität aussieht, auslagern und in den Job selbst integrieren.
Antwort3
Soweit ich herausgefunden habe, dürfen Crontab-Variablen keine Anführungszeichen enthalten und sie dürfen auch nicht länger als 999 Zeichen sein. Die Antwort auf diese Frage ist, dass das einfach nicht möglich ist.