Konfigurowanie zadania cron, które wykonuje chmod / chown


9

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ć?


incron+ inotifybyłyby czystsze rozwiązania :)
— franzlorenzon

Odpowiedzi:


9

Chcesz, aby Twój główny skrypt cron (edycja przez uruchomienie sudo crontab -e) był:

 55 * * * * /bin/chown -R somename /home/somename/Dropbox && /bin/chmod u+rw /home/somename/Dropbox

Zakładając, że użytkownik jest nazwany somenamei że /home/somename/Dropboxjest to pełna ścieżka do katalogu Dropbox. Jako użytkownik root ~ przechodzi do /root.


1
Dzięki za jasną odpowiedź! Myślę, że to pokazuje mi brakujące linki, których szukałem. Najpierw przetestuję to jutro :)
— tvgemert

Przetestowałem to i działa!
— tvgemert

2
Świetny; cieszę się, że działa. Lekcje (a) nie oczekują, że zmienne środowiskowe, takie jak $PATHzdefiniowane, będą równoważne z danymi zalogowanego użytkownika w kronice (np. Na moim Linuxie zdefiniowano $ HOME, ale $ PATH jest ustawione na /usr/bini /binod crontab i $ USER nie jest zdefiniowany; więc w tym przypadku nie trzeba było określać /binprzed chmod / chown), (b) unikać sudow skryptach (uruchamiaj zadanie cron jako rootużytkownik), (c) jako użytkownik root $HOMEbę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.
— dr jimbob

Poleciłbym również umieścić skrypt zgodnie z radą Davida, jeśli kiedykolwiek zrobisz coś bardziej skomplikowanego niż to; skrypt wydaje się przesadny dla kombinacji chmod / chown. Jeśli jednak zaczniesz aplikować do Dropbox lub innych katalogów innych użytkowników lub zdecydujesz się uruchamiać tylko na ostatnio zmienionych plikach (np. Wynik find) itp., To nie ma sensu umieszczać skryptu.
— dr jimbob

16

sudoprawie 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 wdayusercommand
sudo


Dzięki! Stworzyłem to, ale nadal nie jestem tego pewien. Nie uzyskałem oczekiwanego rezultatu: 55 * * * * root chown -R somename ~/Dropbox
— tvgemert

3
somenamemoż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żyje rootkatalogu domowego ...)
— Mei

@David: somenamenie jest ścieżką, ale nazwa użytkownika (i powinna również zawierać nazwę grupy somename:somegroup
— :)

5
@tvgemert To, co David powiedział powyżej (i w swojej odpowiedzi) na temat ścieżek / ścieżek względnych / ścieżek symbolicznych ( ~) 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 robi echo "what you want to do" > /tmp/what-i-would-runi spójrz na wyniki, aby upewnić się, że są rozsądne - DUŻO mniejsze szanse na zniszczenie wszechświata.)
— voretaq7

Dziękuję za użyteczne wskazówki, dał mi więcej wglądu!
— tvgemert

6

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.


5

Istnieje wiele problemów z twoim crontabem:

10 * * * sudo chown -R $USER ~/Dropbox

Problemy:

  • sudonie powinien być tutaj stosowany; wymaga wejścia na terminal
  • chownpowinien być w pełni określony (tj. /bin/chown)
  • USERponieważ rzeczywista zmienna może nie istnieć; niektóre systemy używająLOGNAME
  • ~(tylda) zostanie rozpoznana tylko przez powłokę - goły chownnie zrozumie
  • określenie HOME w crontab roota przechodzi do home roota

Myślę, że tak naprawdę napisałbym to:

#!/bin/bash

# FILE: /usr/local/bin/myscript

USER=$1
eval chown -R $1 ~$1/Dropbox
eval chmod -R u+rw ~$1/Dropbox

(Konieczne evaljest przekonwertowanie ~$1na, ~user a następnie na /home/user.)

Uruchom ten skrypt z crontab roota:

# root's crontab
10 * * * /usr/local/bin/myscript someuser

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.