Wie kann in crontab angegeben werden, von welchem ​​Benutzer das Skript ausgeführt werden soll? [geschlossen]

176

Ich habe nur wenige Crontab-Jobs, die unter root ausgeführt werden, aber das gibt mir einige Probleme. Beispielsweise befinden sich alle Ordner, die während dieses Cron-Jobs erstellt wurden, im Benutzerstamm und im Gruppenstamm. Wie kann ich es schaffen, unter Benutzer-WWW-Daten zu laufen und WWW-Daten zu gruppieren, damit ich beim Ausführen von Skripten von meiner Website aus diese Ordner und Dateien bearbeiten kann?

Mein Server läuft unter Ubuntu.
Aktueller Crontab-Job ist:

*/1 * * * * php5 /var/www/web/includes/crontab/queue_process.php >> /var/www/web/includes/crontab/queue.log 2>&1
Arma
quelle

Antworten:

332

Anstatt eine Crontab zu erstellen, die als Root-Benutzer ausgeführt werden soll, erstellen Sie eine Crontab für den Benutzer, für den Sie das Skript ausführen möchten. In Ihrem Fall crontab -u www-data -ewird die crontab für den www-data-Benutzer bearbeitet. Geben Sie einfach Ihren vollständigen Befehl ein und entfernen Sie ihn von der crontab des Root-Benutzers.

Mike
quelle
53
Dies funktioniert genauso, wenn Sie crontab -eals bestimmter Benutzer verwenden.
Kulak
7
Aber wird diese Crontab beim Systemstart oder nur beim Anmelden des Benutzers überprüft?
Bruno Finger
11
cronAuf * nix-Systemen muss sich kein Benutzer anmelden, um die in der Crontab eines bestimmten Benutzers angegebenen Jobs ausführen zu können.
Mike
2
Wird dadurch auch die Gruppen-ID festgelegt, wie vom OP angefordert? Was ist, wenn sich die gewünschte Gruppe von der primären Gruppe des Benutzers unterscheidet?
Askyle
48

BEARBEITEN: Beachten Sie, dass diese Methode nicht mit crontab -e funktioniert, sondern nur, wenn Sie / etc / crontab direkt bearbeiten. Andernfalls erhalten Sie möglicherweise eine Fehlermeldung wie/bin/sh: www-data: command not found

Kurz vor dem Programmnamen:

*/1 * * * * www-data php5 /var/www/web/includes/crontab/queue_process.php >> /var/www/web/includes/crontab/queue.log 2>&1
Christian Nowak
quelle
Das würde es als Apache-Benutzer laufen lassen, wenn www-Daten richtig sind?
Arma
19
Beachten Sie, dass diese Methode nicht funktioniert crontab -e, sondern nur, wenn Sie /etc/crontabdirekt bearbeiten . Lesen Sie den Kommentar oben in dieser Datei, um weitere Informationen zu erhalten.
imgx64
5
Der Benutzer kann nur in der System-Crontab angegeben werden
James Roth
Ich habe ein paar Jobs im Zeitplan auf System Crontab. Wenn ich das tue sudo crontab -e, sehe ich die Jobs. Aber ich öffne die Datei, /etc/crontabes gibt keine Jobs. Ist das komisch Auch wenn ich sudo crontab -eund einen Job mit benutzerdefinierten hinzufügen, wird es funktionieren?
eNeMetcH
14

Da Sie Ubuntu ausführen, befindet sich Ihr System crontab unter /etc/crontab.

Als Root-Benutzer (oder mit sudo) können Sie diese Datei einfach bearbeiten und den Benutzer angeben, der diesen Befehl ausführen soll. Hier ist das Format der Einträge in der System-Crontab und wie Sie Ihren Befehl eingeben sollten:

# m h dom mon dow user  command
*/1 * * * * www-data php5 /var/www/web/includes/crontab/queue_process.php >> /var/www/web/includes/crontab/queue.log 2>&1

Natürlich sollten die Berechtigungen für Ihr PHP-Skript und Ihre Protokolldatei so festgelegt werden, dass der www-dataBenutzer Zugriff darauf hat.

Pymkin
quelle
Ich dachte, das sollte gleichbedeutend sein mit crontab -e; aber nicht.
Zinking
5
In den Ubuntu-Dokumenten wurde empfohlen, / etc / crontab nicht zu bearbeiten, da dies durch Updates überschrieben werden kann. crontab -e erstellt eine benutzerspezifische Cron-Datei in / var / spool / cron / crontabs.
Hemm
9

Sie können auch versuchen, runuser(als root) einen Befehl als anderer Benutzer auszuführen

*/1 * * * * runuser php5 \
            --command="/var/www/web/includes/crontab/queue_process.php \
                       >> /var/www/web/includes/crontab/queue.log 2>&1"

Siehe auch: man runuser

Russell E Glaue
quelle
runuserist nicht in Ubuntu enthalten.
Raptor
1
runuser ist in der neuesten Version von Ubuntu. Es gibt auch Alternativen zu runuser, wie in dieser Antwort beschrieben. Unix.stackexchange.com/questions/169441/ubuntu-runuser-command , z. B. su und sudo.
Russell E Glaue
8

Mikes Vorschlag klingt nach dem "richtigen Weg". Ich bin auf diesen Thread gestoßen, der den Benutzer angeben vncserverwollte, unter dem er beim Neustart ausgeführt werden soll, und alle meine Cron-Jobs an einem Ort behalten wollte.

Ich habe den folgenden Fehler für das VNC-Cron erhalten:

vncserver: The USER environment variable is not set. E.g.:

In meinem Fall konnte ich sudoangeben, als wen die Aufgabe ausgeführt werden soll.

@reboot sudo -u [someone] vncserver ...
Oliver Moran
quelle
1
Ich habe diese Nachricht in den Protokollen erhalten:sudo: sorry, you must have a tty to run sudo
Renato Gama
@renatoargh Sie laufen wahrscheinlich auf RedHat. Schauen Sie sich diese Antwort auf Unix.SE an.
Kaiser