«sudo crontab -e» не обновляет /etc/hosts

В моем файле /etc/hosts есть такие записи:

127.0.0.1 www.youtube.com

Чтобы я не отвлекался. Когда мне что-то нужно на одном из заблокированных мною сайтов, я добавляю # в начало строки. Выполнив эту команду, я могу сделать так, чтобы все строки можно было раскомментировать, чтобы снова удалить доступ:

sudo sed -i '' 's/\#//g' /etc/hosts

Для автоматического удаления доступа я запускаю sudo crontab -eи добавляю эту строку

*/10 8-15 * * 1-5 sed -i '' 's/\#//g' /etc/hosts

Я также пробовал сsudo crontab -e -u root

После его сохранения Mac запрашивает у терминала разрешение на администрирование машины, которое я предоставляю, и я полагаю, что все должно быть хорошо, но он не видит, что команда когда-либо выполнялась (файл не обновляется). Есть ли что-то, что мне нужно сделать, чтобы заставить его обновить файл?

Какая версия macOS у вас установлена?
Это было хорошее предложение @lx07, но, к сожалению, оно не сработало.

Ответы (1)

Когда вы вводите команду через cron, вам нужно указать весь путь, поэтому вместо этого вы должны использовать /usr/bin/sed.

Есть несколько других вопросов, которые вы должны рассмотреть:

  • cronустарело , и это следует сделать, используя launchdвместо этого

  • Зачем редактировать файл на месте? Просто сохраните исходную версию файла hosts (т. е. /etc/hosts.orig) и создайте новый файл hosts на тот случай, если вы захотите заблокировать YouTube (т. е. /etc/hosts.nodistractions). Просто скопируйте соответствующий файл в /etc/hostsуказанный интервал времени.

    Например, чтобы разблокировать все:

      cp /etc/hosts.orig /etc/hosts
    

    Чтобы перейти в «режим без отвлечения»:

      cp /etc/hosts.nodistractions /etc/hosts
    

Преимущество использования этого метода заключается в том, что вы можете легко отредактировать файл, чтобы добавить больше хостов по мере развития ваших отвлекающих факторов, и вам не придется изменять код. Запуск этого как LaunchDameon выполняет это, rootтак что нет никаких проблем с разрешениями, о которых действительно нужно беспокоиться. Вам не придется спорить sudoили suубеждаться, что вы используете нужного пользователя.

Тем не менее, есть приложение под названием Focus (20 долларов), которое имеет очень богатый набор функций, который позволит вам блокировать не только веб-сайты, но и приложения. Существует функция «сделать перерыв», которая позволит вам снять ограничения на настраиваемый период времени, позволяя вам сделать перерыв или, как вы описали, получить что-то, когда это необходимо. Цена (IMO) вполне разумна для того, что она обеспечивает.

Обратите внимание, что я никоим образом не связан с этим приложением/компанией и лично им не пользуюсь. Я знаю об этом продукте только потому, что мне нужно было найти инструмент для родителей учеников, которые не были сосредоточены на текущей задаче, который дал им возможность автоматически справляться со своими отвлечениями; в основном из-за местоположения (родители на работе, дети дома, не делая уроки).

Я нашел sudo launchctl load ... и изменил разрешения на /etc/hosts, чтобы я мог обновлять его каждые 10 минут. Вероятно, можно было бы сделать любой из них, чтобы заставить его работать. Использование cron просто не сработало для этого, поэтому launchctl, похоже, подходит.