Wie kann ich eine Umgebungsvariable mit Anführungszeichen in Crontab erstellen?

Wie kann ich eine Umgebungsvariable mit Anführungszeichen in Crontab erstellen?

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 cronist:

  1. Erstellen Sie ein Skript zum Ausführen der Befehle
  2. Variablen im Skript festlegen. Es ist auch möglich, externe Dateien mit Variablen zu verwenden:source /path/to/file/with/variables
  3. Vollständigen Pfad zu Befehlen verwenden/usr/bin/ls
  4. Verlassen Sie sich nicht auf Ihren Benutzer-Homepage, Pfad usw.

Und hier ist ein Beispiel, wie Sie ein Shell-Skript erstellen können, das rubyProgramme in verschiedenen Umgebungen ausführt.

Sie cronhaben 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 file1enthalten so etwas wie (Beispiel)

RUBYVAR1_1=1
RUBYVAR1_2=2

Undfile2

RUBYVAR2_1=12
RUBYVAR2_2=22

Antwort2

man 5 crontab

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.

verwandte Informationen