Como PHP para configurar um trabalho crontab que é executado como www-data?

4

Meu servidor está rodando no Ubuntu 14.04 e no nginx. Meu problema diz respeito ao Cron , eu 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 o executar usando o comando: crontab /var/www/html/cron.txt , ele funciona perfeitamente, o script test.php está sendo executado. Mas, quando eu faço o mesmo usando um script PHP (executando via navegador): exec('crontab /var/www/html/cron.txt'); , ele 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 o 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 fazer as tarefas do www-data também?

    
por BociucH 06.06.2017 / 20:36

4 respostas

2

Eu não entendo claramente o que você está tentando alcançar. Tanto quanto eu entendo você precisa executar um cron job como usuário www-data . Geralmente (é altamente recomendado) o usuário www-data não tem acesso ao shell. Mas você pode executar tarefas do cron como www-data, colocando suas tarefas no cron root da seguinte forma:

* * * * * su www-data -s /bin/bash -c "/usr/bin/php /YOUR_PATH/task.php"

Esta é também uma maneira limpa, pois você tem todas as tarefas cron do sistema centralizadas em um arquivo, mas cada tarefa é executada como o usuário necessário (com as permissões e os atributos apropriados).

Você pode alterar os parâmetros * * * * para ajustar a programação do seu trabalho. No meu exemplo, ele é executado a cada um minuto.

Espero que ajude.

    
por 06.06.2017 / 23:16
1

Você quer algo estranho. Por que você executa o crontab a partir do script php? Crontab é um agendador de tarefas baseado em tempo, não deve ser executado a partir do script php. Se você quiser iniciar o cronjob como www-data, você deve configurá-lo pelo comando crontab -u www-data -e e depois disso, o seu trabalho será executado como você o configurou.

    
por 06.06.2017 / 22:12
0

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

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

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

    
por 07.06.2017 / 07:41
0

Nextcloud precisa da mesma coisa. Eles não parecem capazes de fazer o PHP configurar um trabalho Cron no instalador e insistem que o administrador do Linux faça isso.

Então, para o seu primeiro Q: Como eu uso o PHP para configurar um trabalho crontab www-data? R: Você não precisa fazer isso da Shell.

Quanto ao seu segundo Q: O crontab pode executar um trabalho de dados da www? R: Totalmente, mas essa parte é feita no momento em que o trabalho do crontab é configurado. Usar www-data para executar uma tarefa cron a partir de qualquer arquivo cron é uma má idéia, apenas deixe www-data executar o próprio trabalho do crontab.

Veja como eu fiz isso funcionar:

  1. Sua string provavelmente deve ser:

* * * * * php -f /var/www/html/test.php >> /var/log/cron.log

  1. www-data é esquisito como usuário Cron.

Do terminal, configure o Cron desta forma:

Executando como root ...

crontab -u www-data -e ... adiciona a string para ser executada, semelhante ao seu Q.

... Mas, você parece querer usar o PHP para configurar o trabalho do crontab. (Eu suponho que este é um instalador do PHP.) Ter um aplicativo PHP configurado para um trabalho de crontab pode não ser possível. Pode até não ser uma boa ideia. Se você puder fazer isso, deixe a Nextcloud se informar, porque eles não parecem saber.

    
por 08.11.2018 / 06:01