Ich möchte einen Cron-Job einrichten, der rekusiv ein chmod / chown für ein Verzeichnis (das Dropbox-Verzeichnis) ausführt.
Dies funktioniert, wenn ich die Befehle manuell ausführe wie:
sudo chown -R $USER ~/Dropbox
sudo chmod -R u+rw ~/Dropbox
Ich habe versucht, es in einen Cron-Job wie diesen umzuwandeln:
10 * * * * sudo chown -R $USER ~/Dropbox
Aber es scheint nicht den Job zu machen.
Wie macht man das?
permissions
cron
mac-osx-server
tvgemert
quelle
quelle
incron
+inotify
wäre sauberere Lösungen :)Antworten:
Sie möchten, dass Ihr Root-Cron-Skript (durch Ausführen bearbeiten
sudo crontab -e
) wie folgt lautet :Angenommen, der Benutzer heißt
somename
und das/home/somename/Dropbox
ist der vollständige Pfad Ihres Dropbox-Verzeichnisses. Als Root-Benutzer geht ~ zu/root
.quelle
$PATH
definiert werden, die denen eines angemeldeten Benutzers in einem Cronjob entsprechen (z. B. ist auf meiner Linuxbox $ HOME definiert, aber $ PATH wird auf/usr/bin
und/bin
von crontab und $ USER gesetzt ist nicht definiert; in diesem Fall mussten Sie also nicht/bin
vor chmod / chown angeben ), (b)sudo
in Skripten vermeiden (cron task alsroot
Benutzer ausführen ), (c) da sich der Root-Benutzer$HOME
auf / root bezieht, nicht auf Ihren normalen Benutzer , (d)~
sollte in Cron-Skripten vermieden werden (standardmäßig ausgeführt als#!/bin/sh
.find
) usw. auszuführen , ist es sinnvoll, ein Skript einzufügen .sudo
sollte fast nie in geplanten Aufgaben verwendet werden. Es erwartet, mit einem Terminal kommunizieren zu können, und erfordert bestimmte Flags, um dies nicht zu versuchen.Erstellen Sie stattdessen Ihren Cron-Job als Root (in
/etc/crontab
- Beachten Sie, dass das Format dieser Datei etwas anders ist :). Dies hat auch den Vorteil, dass auf Systemen gearbeitet wird, auf denen keine installiert ist.minute hour mday month wday
user
command
sudo
quelle
55 * * * * root chown -R somename ~/Dropbox
somename
könnte überall sein; es ist ein relativer Weg. Zweitens~
wird nur von der Schale verstanden; verwenden$HOME
. Verwenden Sie einen Befehl wie diesen:chown -R /some/path/somename $HOME/Dropbox
(dies wirdroot
das Home-Verzeichnis verwenden ...)somename
ist kein Pfad, aber der Benutzername (und sollte auch den Gruppennamen enthaltensomename:somegroup
~
) gesagt hat, ist KRITISCH WICHTIG - Bitte verbringen Sie einige Zeit mit den Manpages von cron und crontab und stellen Sie sicher, dass Sie verstehen, was los ist (im Zweifelsfall) , erstellen Sie einen Cron-Job, der dies tut,echo "what you want to do" > /tmp/what-i-would-run
und sehen Sie sich die Ergebnisse an, um sicherzugehen, dass sie vernünftig sind - VIEL weniger Chancen, das Universum zu zerstören.)Zwei Probleme:
1) Pfade werden in cron normalerweise nicht so eingerichtet wie beim Anmelden. Versuchen Sie / usr / bin / sudo / bin / chown ... (oder was auch immer die richtigen Pfade zu diesen Programmen auf Ihrem System sind).
2) sudo fragt normalerweise nach Ihrem Passwort oder ist ansonsten möglicherweise nicht zufrieden damit, nicht interaktiv zu laufen. Ich schlage vor, Sie setzen die Befehle stattdessen ohne sudo in die crontab von root, dann werden die Befehle als root ausgeführt.
quelle
Es gibt mehrere Probleme mit Ihrer Crontab:
Die Probleme:
sudo
sollte hier nicht verwendet werden; es erfordert Klemmeneingangchown
sollte vollständig spezifiziert sein (dh/bin/chown
)USER
als tatsächliche Variable kann nicht existieren; Einige Systeme verwendenLOGNAME
~
(Tilde) wird nur von einer Shell erkannt - ein Barechown
wird es nicht verstehenIch denke, ich würde es tatsächlich schreiben:
(Das
eval
ist zu konvertieren benötigt ,~$1
um~user
dann zu/home/user
.)Führen Sie dieses Skript von Roots Crontab aus:
quelle
Alternativ können Sie möglicherweise die ACL-Unterstützung aktivieren und setfacl verwenden, um das gleiche / ähnliche Ergebnis zu erzielen.
quelle