Хобрук: Ваш путь к мастерству в программировании

Отказано в разрешении PHP Cronjob?

Итак, я настроил cronjob для запуска следующей команды:

php /var/www/path/to/cron/do-stuff.php

Путь правильный. Каталог принадлежит www-data.

Скрипт делает следующее:

chdir( getcwd() );
echo shell_exec('whoami');

$handle = fopen(uniqid('TEST_') . '.tst');
fwrite($handle, 'foo');
fclose($handle);

Это вывод, который я получаю при попытке запустить задание cron:

www-data
PHP Warning:  fopen(TEST_4e15266d09fa2.tst): failed to open stream: Permission denied

Тем не менее, когда вы делаете это из оболочки с помощью su www-data, сценарий выполняется просто отлично и создает тестовый файл без сбоев.

Любая идея, почему это может быть?

РЕДАКТИРОВАТЬ: я думаю, что su www-data, вероятно, не нужен, потому что php будет работать, как бы он ни работал, но я попробовал это на всякий случай. Однако cron и скрипт выполняются как www-data, как видно из вывода.

07.07.2011

Ответы:


1

Вы пытались указать полный путь в функции fopen вместо только имени файла?

07.07.2011
  • Бинго! Я дебил. getcwd сообщил /usr/share/webmin/cron. 07.07.2011

  • 2

    Задание cron обрабатывает PATH совершенно по-другому. Тот же самый сценарий, который обычно работает при вызове из командной строки, может возвращать ошибку разрешения, подобную этой, при вызове из crontab, если вы не укажете PATH.

    Попробуйте изменить строку:

    $handle = fopen(uniqid('TEST_') . '.tst');
    

    примерно так:

    $handle = fopen('/var/www/vhosts/yourpath/'.uniqid('TEST_') . '.tst');
    

    Это сработало для меня.

    23.09.2011

    3

    Я уверен, что даже несмотря на то, что это в cron, сам PHP по-прежнему работает как пользователь по умолчанию (конечно, это может варьироваться), и это нельзя изменить разумно. Я могу ошибаться. Попробуйте сгруппировать каталог для системного пользователя PHP (apache?) и предоставить группе права на запись. Затем посмотрите, работает ли это.

    07.07.2011
  • Я думал, что www-data был пользователем php? Я имею в виду, это то, что показывает whoami. Я просто не понимаю, как скрипт может быть заблокирован в одном экземпляре, а не во втором. 07.07.2011
  • Какой пользователь запускает cron? ..? 07.07.2011
  • www-data -- оказывается, проблема была в getcwd. 07.07.2011
  • Новые материалы

    Аргументы прогрессивного улучшения почти всегда упускают суть
    В наши дни в кругах веб-разработчиков много болтают о Progressive Enhancement — PE, но на самом деле почти все аргументы с обеих сторон упускают самую фундаментальную причину, по которой PE..

    Введение в Джанго Фреймворк
    Схема «работать умно, а не усердно» В этой и последующих статьях я познакомлю вас с тем, что такое фреймворк Django и как создать свое первое приложение с помощью простых и понятных шагов, а..

    Настольный ПК как «одно кольцо, чтобы править всеми» домашних компьютеров
    Вид после 9 месяцев использования С настольных компьютеров все началось, но в какой-то момент они стали «серверами», и мы все перешли на ноутбуки. В прошлом году я столкнулся с идеей настольных..

    Расширенные методы безопасности для VueJS: реализация аутентификации без пароля
    Руководство, которое поможет вам создавать безопасные приложения в долгосрочной перспективе Безопасность приложений часто упускается из виду в процессе разработки, потому что основная..

    стройный-i18следующий
    Представляем стройную оболочку для i18next. Эта библиотека, основанная на i18next, заключает экземпляр i18next в хранилище svelte и отслеживает события i18next, такие как languageChanged,..

    Обзор 20 основных и современных методов работы с массивами в JavaScript
    Вы знаете их всех? В этом коротком посте я покажу сводку методов, доступных в JavaScript для работы с массивами. Я надеюсь, что вы найдете это полезным! В конце поста вы найдете ссылку на..

    Да, но я чувствую необходимость указать, что это или не единственные два.
    Да, но я чувствую необходимость указать, что это или не единственные два. Обучение с подкреплением (в качестве примера) также является важным.