Налаштування роботи cron, яка виконує chmod / chown


9

Я хотів би встановити роботу cron, яка б рекрусивно робив chmod / chown в каталозі (каталог dropbox).

Це працює, коли я виконую команди вручну, як:

sudo chown -R $USER ~/Dropbox
sudo chmod -R u+rw ~/Dropbox

Я спробував перетворити це на роботу з кроном так:

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

Але це, здається, не справляється з роботою.

Як це зробити?


incron+ inotifyбули б чистіші рішення :)
franzlorenzon

Відповіді:


9

Ви хочете, щоб ваш сценарій root cron (редагування запущено sudo crontab -e) був:

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

Якщо припустити, що ім’я користувача названо, somenameі /home/somename/Dropboxце повний шлях до вашого каталогу Dropbox. Як користувач root, ~ переходить до /root.


1
Дякую за чітку відповідь! Я думаю, це показує мені деякі з відсутніх посилань, які я шукав. Я перевіряю це перше, що завтра :)
tvgemert

Випробував це, і це працює!
tvgemert

2
Чудовий; рада її роботі. Уроки: (а) не очікуйте, що змінні середовища, як-от, $PATHвизначатимуться еквівалентними тим, хто зареєстрований користувачем у cronjob (наприклад, у моєму linuxbox $ HOME визначено, але $ PATH встановлено на /usr/binі /binвід crontab та $ USER не визначено; тому в цьому випадку вам не потрібно було вказувати /binперед chmod / chown), (b) уникати sudoв сценаріях (запустити cron завдання як rootкористувач), (c) як root користувач $HOMEбуде посилатися на / root не на ваш звичайний користувач , (г) ~слід уникати в сценаріях cron (за замовчуванням виконувати як #!/bin/sh.
dr jimbob

Я також рекомендую ввести сценарій за порадою Девіда, якщо ви коли-небудь зробите щось складніше, ніж це; сценарій здається непосильним для комбінації chmod / chown. Однак якщо ви починаєте застосовувати до Dropboxes інших користувачів або інші каталоги або вирішите запускати лише нещодавно змінені файли (наприклад, результат find) тощо, ніж це має сенс вводити в сценарій.
dr jimbob

16

sudoповинні майже ніколи не будуть використовуватися в заплановані завдання. Він очікує, що зможе поговорити з терміналом і вимагає конкретних прапорів, щоб уникнути спроб зробити це.

Створіть свою роботу cron як root ( замість /etc/crontab- зауважте, що формат цього файлу дещо інший :). Це також має перевагу роботи в системах, де не встановлено.minute hour mday month wdayusercommand
sudo


Дякую! Я створив це, але все ще не впевнений у цьому. Я не отримав очікуваного результату: 55 * * * * root chown -R somename ~/Dropbox
tvgemert

3
somenameможе бути де завгодно; це відносний шлях. По-друге, ~розуміється лише оболонка; використання $HOME. Використовуйте команду: chown -R /some/path/somename $HOME/Dropbox(це буде використовувати rootдомашній каталог ...)
Мей

@David: somenameце не шлях, але ім'я користувача (і також має містити назву групи somename:somegroup
:)

5
@tvgemert Те, що Давид сказав вище (і у своїй відповіді) щодо шляхів / відносних шляхів / символічних шляхів ( ~), КРИТИЧНО ВАЖЛИВО - Будь ласка, проведіть деякий час зі сторінками cron і crontab man і будьте впевнені, що ви розумієте, що відбувається (якщо сумніваєтесь) , створіть роботу з хроном, echo "what you want to do" > /tmp/what-i-would-runі перегляньте результати, щоб переконатися, що вони здорові - МНОГО менше шансів знищити Всесвіт.)
voretaq7

Дякую за корисні поради, дав мені більше розуміння!
tvgemert

6

Два питання:

1) Шляхи зазвичай не встановлені в кроні так, як вони під час входу. Спробуйте / usr / bin / sudo / bin / chown ... (або будь-які правильні шляхи до тих програм у вашій системі).

2) sudo зазвичай запитує ваш пароль, інакше він може не раді працювати неінтерактивно. Я пропоную вам поставити команди в crontab кореня без sudo, тоді команди виконуються як root.


5

З вашим crontab є кілька проблем:

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

Питання:

  • sudoне слід використовувати тут; для цього потрібен термінальний вхід
  • chownмає бути повністю вказано (тобто /bin/chown)
  • USERоскільки фактична змінна може не існувати; деякі системи використовуютьLOGNAME
  • ~(тильда) буде розпізнана лише оболонкою - голий chownне зрозуміє цього
  • Вказавши HOME у кореневому кореневому корі, він переходить до дому кореня

Я думаю, що насправді це сценарій:

#!/bin/bash

# FILE: /usr/local/bin/myscript

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

(The evalнеобхідно , щоб перетворити ~$1в ~user те , щоб /home/user.)

Запустіть цей скрипт із crontab root:

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

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.