Aus welchem ​​Kontext wird eine Cron-Aufgabe ausgeführt?

Aus welchem ​​Kontext wird eine Cron-Aufgabe ausgeführt?

Ich stelle diese Frage, nachdem ich eine Linux-Box gründlich zerstört habe. Lassen Sie mich Ihnen einige Hintergrundinformationen geben, damit Sie wissen, was ich meine.

Ich habe derzeit (oder zumindest hatte ich) eine RedHat Linux-Box mit Apache und Phusion Passenger, um Ruby-Apps unter Apache auszuführen. Die App fungiert als Dienst, um Kiosken im Raum Cincinnati regelmäßig zwischengespeicherte Dateien bereitzustellen. Die Web-App funktionierte hervorragend und der einzige noch zu erledigende Teil war das Einrichten einer Cron-Aufgabe, um alle Informationen abzurufen, die zwischengespeichert werden mussten, und diese in einige verschiedene Update-Pakete zu packen, um sie den Kiosken bereitzustellen. Zu diesem Zweck habe ich ein Ruby-Skript geschrieben, das das Abrufen und Verpacken der Daten übernimmt. Zum Einrichten der Cron-Aufgabe habe ich einfach die integrierte Crontab verwendet. Das Skript sah folgendermaßen aus:

#!/bin/bash

cd ../lib
ruby pdf_cache.rb
ruby pdf_prepare.rb
ruby rss_cache.rb
ruby nightly-pack.rb 
cd ..
chown -R www.www *

Dieses Skript befand sich im Cron-Ordner und die Verzeichnisstruktur sah folgendermaßen aus:

.
|-- cron
|-- feeds
|-- lib
|   `-- trash
|-- logs
|-- nightly-packs
|-- pdf
|   `-- tank
|-- public
`-- tmp

und ich habe es crontab -emit rootfolgendem Inhalt ausgeführt:

0 3 * * * /usr/local/apache2/ruby_projects/kiosk/cron/schedule_job

Das sollte das Skript jeden Tag um 3 Uhr morgens ausführen. Am nächsten Tag, nachdem ich diesen Cron-Task geplant hatte, erlebte ich eine sehr unangenehme Überraschung. Der Cron-Task wurde im Stammverzeichnis ausgeführt und ich gehe davon aus, dass die meisten Befehle fehlschlugen, mit Ausnahme der chmod -R www.www *Änderung des Eigentümers aller Elemente im System auf den wwwBenutzer.

Meine Frage ist: Wie kann ich eine Cron-Aufgabe richtig implementieren und in welchem ​​Kontext wird die Cron-Aufgabe ausgeführt? Mir ist jetzt klar, dass ich dies wahrscheinlich nicht unter dem rootKonto ausführen sollte, und ich bin mir nicht sicher, wie ich es unter dem Konto ausführen soll, wwwda dieser Benutzer keine Shell hat und Sie nicht erfolgreich suauf den wwwBenutzer zugreifen können.

Antwort1

Ich wette, Sie könnten dem Benutzer einfach eine Shell geben und dabei lediglich die Möglichkeit des Fernzugriffs und der Berechtigungen einschränken.

Cron-Tasks werden unter den Benutzern ausgeführt, die sie erstellt haben. Aus diesem Grund werden sie als ausgeführt root.

Antwort2

Ein weiterer Vorschlag: Fügen Sie -eder Shebang-Zeile in Skripten wie diesem (dh #!/bin/bash -e) Folgendes hinzu. Dadurch wird das Skript beendet, wenn ein darin enthaltener Befehl fehlschlägt. Dies garantiert zwar nicht, dass Sie keine unangenehmen Überraschungen erleben, verhindert jedoch, dass das Skript völlig aus den Fugen gerät (sozusagen), und verhindert viele Arten von Fehlern in Form von Kettenreaktionen.

Antwort3

Der richtige Weg hierfür ist „su - “. Richten Sie Ihren Cronjob als diesen Benutzer ein. Dann wird er als dieser Benutzer ausgeführt. Oder, je nachdem, welchen Cron-Daemon Sie verwenden, könnte es ein sechstes Feld geben, um den Benutzer zu definieren.

Hoffe, das hilft. Es gibt noch andere Hacks, aber Sie sind immer am besten beraten, wenn es richtig funktioniert.

verwandte Informationen