Executando um cronjob como www-data

Executando um cronjob como www-data

Meu servidor está rodando no Ubuntu e nginx. Meu problema diz respeitoCron, gostaria de iniciá-lo (crontab) usando um arquivo -cron.txt, seu conteúdo:

* * * * * /usr/bin/php /var/www/html/test.php >> /var/log/cron.log

Se eu executá-lo usando um comando: crontab /var/www/html/cron.txt, funciona perfeitamente, scriptteste.phpestá sendo executado. Mas quando faço o mesmo mas usando um script PHP (executando via navegador): exec('crontab /var/www/html/cron.txt');, não funciona.

Verificando o cronjob atual pelo comando: crontab -l -u www-data, a linha do arquivo aparece, mas o Cron não faz seu trabalho. Talvez esteja relacionado a alguns problemas de permissão? Porque só funciona executando como root. Existe uma maneira de forçar o Cron a realizar as tarefas do www-data também?

Responder1

Por favor, use /etc/crontab. Esse método de execução de tarefas cron permite adicionar um nome de usuário à tarefa. Isso parecerá assim:

* * * * * www-data /usr/bin/php /var/www/html/test.php >> /var/log/cron.log

Você pode fazer nano /etc/crontabe adicionar a linha ao arquivo.

Mas quando faço o mesmo, mas usando um script PHP (executando via navegador): exec('crontab /var/www/html/cron.txt');, não funciona.

Se isso não funcionar, você provavelmente terá outro problema além do uso do "crontab". Por exemplo: você não precisa redirecionar? (ou seja, usar > /dev/null 2>/dev/null &no final do seu comando exec?).

Responder2

Consegui o que queria, tudo sobre o código no meu post inicial está ok, a única coisa que eu deveria saber é que o usuário www-data não tem permissão para escrever /var/log, então não tive saída lá. E além disso, no meu script PHP eu estava tentando criar um arquivo e escrever algo nele, para fazer isso, o caminho absoluto é necessário, então deve ficar assim:

dirname(__FILE__) . '/myfile.txt';

Após essas alterações, tudo funciona conforme o esperado.

informação relacionada