Настройка работы cron, которая выполняет chmod / chown


9

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

Это работает, когда я выполняю команды вручную, например:

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

Я пытался преобразовать его в работу cron, как это:

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

Но это не похоже на работу.

Как это сделать?


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

Ответы:


9

Вы хотите, чтобы ваш корневой скрипт 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

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

Я бы также порекомендовал добавить скрипт по совету Дэвида, если вы когда-нибудь сделаете что-нибудь более сложное, чем это; скрипт кажется излишним для комбинации chmod / chown. Однако, если вы начинаете обращаться к Dropbox-ам или другим каталогам других пользователей или решаете запускать только недавно измененные файлы (например, результат find) и т. Д., Чем имеет смысл поместить в скрипт.
Доктор Джимбоб

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домашний каталог ...)
Mei

@David: somenameэто не путь, а имя пользователя (и также должно содержать имя группы somename:somegroup
:)

5
@tvgemert То, что Дэвид сказал выше (и в своем ответе) относительно путей / относительных путей / символических путей ( ~), КРИТИЧЕСКИ ВАЖНО. Пожалуйста, потратьте некоторое время на страницы справочника cron и crontab и убедитесь, что вы понимаете, что происходит (если есть сомнения создайте задание cron, которое echo "what you want to do" > /tmp/what-i-would-runвыполнит, и посмотрите на результаты, чтобы убедиться, что они нормальные - НАМНОГО меньше шансов уничтожить вселенную.)
voretaq7

Спасибо за полезные советы, дал мне больше понимания уже!
tvgemert

6

Два вопроса:

1) Пути обычно не устанавливаются в cron так же, как при входе в систему. Попробуйте / usr / bin / sudo / bin / chown ... (или любые другие правильные пути для этих программ в вашей системе).

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


5

Есть несколько проблем с вашим crontab:

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

Проблемы:

  • sudoне должен использоваться здесь; требует терминального ввода
  • chownдолжно быть полностью указано (т. е. /bin/chown)
  • USERпоскольку фактическая переменная может не существовать; некоторые системы используютLOGNAME
  • ~(тильда) будет распознаваться только оболочкой - голый chownне поймет
  • указание HOME в crontab root идет в дом root

Я думаю, что на самом деле я написал бы это:

#!/bin/bash

# FILE: /usr/local/bin/myscript

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

( evalНеобходимо преобразовать ~$1в ~user затем в /home/user.)

Запустите этот скрипт из корневого каталога:

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

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.