Я хотел бы настроить задание cron, которое повторно выполняет chmod / chown в каталоге (каталог dropbox).
Это работает, когда я выполняю команды вручную, например:
sudo chown -R $USER ~/Dropbox
sudo chmod -R u+rw ~/Dropbox
Я попытался преобразовать его в такую работу cron:
10 * * * * sudo chown -R $USER ~/Dropbox
Но, похоже, это не работает.
Как это сделать?
sudo
должен почти никогда использоваться в запланированных задачах. Он ожидает, что сможет разговаривать с терминалом, и требует определенных флагов, чтобы не пытаться это сделать.
Создайте задание cron как root (в /etc/crontab
- Обратите внимание, что формат этого файла немного отличается: minute hour mday month wday
user
command
) вместо этого.
Это также имеет преимущество при работе с системами, в которых sudo
не установлен.
Вам нужен корневой скрипт 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) Пути обычно не настраиваются в cron так, как при входе в систему. Попробуйте / usr / bin / sudo / bin / chown ... (или любые другие правильные пути к этим программам в вашей системе).
2) sudo обычно запрашивает ваш пароль, иначе он может не работать без взаимодействия. Я предлагаю вам поместить команды в crontab root без sudo, тогда команды будут выполняться от имени root.
С вашим crontab есть несколько проблем:
10 * * * sudo chown -R $USER ~/Dropbox
Проблемы:
sudo
здесь не следует использовать; требуется ввод терминалаchown
должны быть полностью указаны (т. е. /bin/chown
)USER
поскольку фактическая переменная может не существовать; некоторые системы используют LOGNAME
~
(тильда) распознается только оболочкой - голым chown
не поймуДумаю, я бы на самом деле написал сценарий:
#!/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
В качестве альтернативы вы можете включить поддержку ACL и используйте setfacl для достижения того же / подобного результата.