Chciałbym skonfigurować zadanie crona, które rekusywnie wykonuje chmod / chown w katalogu (katalog dropbox).
Działa to, gdy wykonuję polecenia ręcznie, takie jak:
sudo chown -R $USER ~/Dropbox
sudo chmod -R u+rw ~/Dropbox
Próbowałem przekonwertować go na zadanie CRON takie:
10 * * * * sudo chown -R $USER ~/Dropbox
Ale to chyba nie działa.
Jak to zrobić?
permissions
cron
mac-osx-server
tvgemert
źródło
źródło
incron
+inotify
byłyby czystsze rozwiązania :)Odpowiedzi:
Chcesz, aby Twój główny skrypt cron (edycja przez uruchomienie
sudo crontab -e
) był:Zakładając, że użytkownik jest nazwany
somename
i że/home/somename/Dropbox
jest to pełna ścieżka do katalogu Dropbox. Jako użytkownik root ~ przechodzi do/root
.źródło
$PATH
zdefiniowane, będą równoważne z danymi zalogowanego użytkownika w kronice (np. Na moim Linuxie zdefiniowano $ HOME, ale $ PATH jest ustawione na/usr/bin
i/bin
od crontab i $ USER nie jest zdefiniowany; więc w tym przypadku nie trzeba było określać/bin
przed chmod / chown), (b) unikaćsudo
w skryptach (uruchamiaj zadanie cron jakoroot
użytkownik), (c) jako użytkownik root$HOME
będzie odnosił się do / root, a nie do zwykłego użytkownika , (d)~
należy unikać w skryptach cron (domyślnie uruchamiany jako#!/bin/sh
.find
) itp., To nie ma sensu umieszczać skryptu.sudo
prawie nigdy nie powinien być stosowany w zaplanowanych zadaniach. Oczekuje, że będzie w stanie rozmawiać z terminalem i wymaga określonych flag, aby uniknąć próby.Utwórz zadanie crona jako root (w
/etc/crontab
- Zauważ, że format tego pliku jest nieco inny :). Ma to również tę zaletę, że działa na systemach, na których nie jest zainstalowany.minute hour mday month wday
user
command
sudo
źródło
55 * * * * root chown -R somename ~/Dropbox
somename
może być gdziekolwiek; jest to ścieżka względna. Po drugie,~
jest rozumiany tylko przez powłokę; użyć$HOME
. Użyj następującego polecenia:chown -R /some/path/somename $HOME/Dropbox
(użyjeroot
katalogu domowego ...)somename
nie jest ścieżką, ale nazwa użytkownika (i powinna również zawierać nazwę grupysomename:somegroup
~
) jest KRYTYCZNIE WAŻNE - Proszę poświęcić trochę czasu na stronach podręcznika użytkownika cron i crontab i upewnij się, że rozumiesz, co się dzieje (w razie wątpliwości , stwórz pracę crona, która to robiecho "what you want to do" > /tmp/what-i-would-run
i spójrz na wyniki, aby upewnić się, że są rozsądne - DUŻO mniejsze szanse na zniszczenie wszechświata.)Dwie kwestie:
1) Ścieżki zwykle nie są konfigurowane w cronie w taki sam sposób, jak podczas logowania. Spróbuj / usr / bin / sudo / bin / chown ... (lub jakąkolwiek inną właściwą ścieżkę do tych programów w systemie).
2) sudo zwykle prosi o podanie hasła lub może nie być zadowolony z nieinteraktywnego działania. Sugeruję, aby zamiast tego umieścić polecenia w crontab roota bez sudo, a następnie polecenia będą działać jako root.
źródło
Istnieje wiele problemów z twoim crontabem:
Problemy:
sudo
nie powinien być tutaj stosowany; wymaga wejścia na terminalchown
powinien być w pełni określony (tj./bin/chown
)USER
ponieważ rzeczywista zmienna może nie istnieć; niektóre systemy używająLOGNAME
~
(tylda) zostanie rozpoznana tylko przez powłokę - gołychown
nie zrozumieMyślę, że tak naprawdę napisałbym to:
(Konieczne
eval
jest przekonwertowanie~$1
na,~user
a następnie na/home/user
.)Uruchom ten skrypt z crontab roota:
źródło
Alternatywnie możesz być w stanie włączyć obsługę ACL i użyć setfacl, aby osiągnąć ten sam / podobny wynik.
źródło