Je voudrais mettre en place un travail cron qui fait récursivement un chmod / chown sur un répertoire (le répertoire dropbox).
Cela fonctionne lorsque j'exécute les commandes manuellement comme:
sudo chown -R $USER ~/Dropbox
sudo chmod -R u+rw ~/Dropbox
J'ai essayé de le convertir en un travail cron comme celui-ci:
10 * * * * sudo chown -R $USER ~/Dropbox
Mais cela ne semble pas faire l'affaire.
Comment faire ça?
permissions
cron
mac-osx-server
tvgemert
la source
la source
incron
+inotify
serait des solutions plus propres :)Réponses:
Vous voulez que votre script cron racine (éditer en exécutant
sudo crontab -e
) soit:En supposant que l'utilisateur est nommé
somename
et qu'il/home/somename/Dropbox
s'agit du chemin complet de votre répertoire Dropbox. En tant qu'utilisateur root, ~ va à/root
.la source
$PATH
soient définies comme équivalentes à celles d'un utilisateur connecté dans un cronjob (par exemple, sur ma linuxbox $ HOME est défini, mais $ PATH est défini vers/usr/bin
et/bin
depuis crontab et $ USER n'est pas défini; dans ce cas, vous n'avez pas besoin de spécifier/bin
avant chmod / chown), (b) évitersudo
dans les scripts (exécuter la tâche cron en tantroot
qu'utilisateur), (c) en tant qu'utilisateur root$HOME
fera référence à / root n'est pas votre utilisateur normal , (d)~
devrait être évité dans les scripts cron (par défaut exécuté comme#!/bin/sh
.find
), etc., il est logique de mettre un script.sudo
ne devrait presque jamais être utilisé dans des tâches planifiées. Il s'attend à pouvoir parler à un terminal et nécessite des indicateurs spécifiques pour éviter d'essayer de le faire.Créez votre travail cron en tant que root (dans
/etc/crontab
- Notez que le format de ce fichier est légèrement différent :) à la place. Cela a également l'avantage de travailler sur des systèmes où n'est pas installé.minute hour mday month wday
user
command
sudo
la source
55 * * * * root chown -R somename ~/Dropbox
somename
pourrait être n'importe où; c'est un chemin relatif. Deuxièmement,~
n'est compris que par la coquille; utiliser$HOME
. Utilisez une commande comme celle-ci:chown -R /some/path/somename $HOME/Dropbox
(ceci utiliseraroot
le répertoire personnel de ...)somename
n'est pas un chemin, mais le nom d'utilisateur (et doit également contenir le nom du groupesomename:somegroup
~
) est CRITIQUEMENT IMPORTANT - Veuillez passer du temps avec les pages de manuel cron et crontab et assurez-vous de comprendre ce qui se passe (en cas de doute , créez un travail cron qui fonctionneecho "what you want to do" > /tmp/what-i-would-run
et regardez les résultats pour vous assurer qu'ils sont sains d'esprit - BEAUCOUP moins de chances de détruire l'univers.)Deux problèmes:
1) Les chemins d'accès ne sont normalement pas configurés dans cron de la même manière que lorsque vous vous connectez. Essayez / usr / bin / sudo / bin / chown ... (ou quels que soient les bons chemins d'accès à ces programmes sur votre système).
2) sudo vous demande normalement votre mot de passe, ou peut ne pas être content de fonctionner de manière non interactive. Je vous suggère de mettre les commandes dans la crontab de root sans le sudo à la place, puis les commandes s'exécutent en tant que root.
la source
Il y a plusieurs problèmes avec votre crontab:
Les problèmes:
sudo
ne doit pas être utilisé ici; il nécessite une entrée de terminalchown
devrait être entièrement spécifié (c.-à-d./bin/chown
)USER
comme une variable réelle peut ne pas exister; certains systèmes utilisentLOGNAME
~
(tilde) ne sera reconnu que par un shell - un nuchown
ne le comprendra pasJe pense que je le rédigerais en fait:
(Le
eval
est nécessaire pour convertir~$1
en~user
puis en/home/user
.)Exécutez ce script à partir de la crontab de root:
la source
Comme alternative, vous pourriez être en mesure d' activer le support ACL et d'utiliser setfacl pour obtenir le même résultat / similaire.
la source