Por que as tarefas cron criadas pelo WWW-DATA não estão sendo executadas?

1

Eu tenho o Ubuntu 14 e quero criar algumas tarefas do cron usando meu código PHP.

Atualmente, estou fazendo algo como crontab -u www-data e, no meu código PHP, posso gravar no crontab.

Se eu fizer crontab -u www-data -e eu posso ver que existem alguns comandos, mas esses comandos não estão sendo executados, mas se eu adicionar os mesmos comandos a crontab -e (sem especificar usuário), eles serão executados com sucesso.

Os arquivos Cron também têm OBATÓRIO nova linha no final.

TL; DR: Como posso fazer trabalhos cron do trabalho criados pelo usuário www-data work?

EDIT: 1

SOLUÇÃO: clique para ver a solução

    
por Umair 03.02.2017 / 18:49

3 respostas

3

O Cron executará os itens www.data. Você pode verificar isso com este teste simples:

$ sudo crontab -u www-data -e

Adicione esta entrada:

* * * * * date >> /tmp/date.out

Agora examine a saída com:

$ tail -f /tmp/date.out

Depois de ter feito isso para garantir que seu crontab esteja funcionando, você pode trabalhar com os scripts que deseja executar.

o usuário www-data , embora não tenha o mesmo caminho que você, portanto, muitos comandos que funcionam na sua conta não funcionarão do usuário www-data , a menos que você defina especificamente o caminho para esse script. O caminho padrão do www-data contém apenas: PATH=/usr/bin:/bin

Você pode fazer isso exportando sua lista de caminhos e colocando-a em uma lista de caminhos para o script.

Você pode fazer isso com:

$ echo $PATH > ~/mypath.txt

Agora acrescente o texto do ~ / mypath.txt ao topo do seu script como:

Seu script:

#!/bin/bash

export PATH=$PATH:/home/users/l/j/ljames/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/snap/bin
# rest of your script code here.

Você pode ajustar o caminho removendo alguns itens óbvios que você não estará usando, como no caso do meu exemplo:

/home/users/l/j/ljames/bin
/usr/games
/usr/local/games
/snap/bin

Isso deixaria a linha de caminho do script com:

#!/bin/bash

export PATH=$PATH:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin

# ... rest of your script code here

script PHP executado no cron

O script de teste do php ( /home/users/l/j/ljames/test.php )

#!/usr/bin/php

<?php
        $string='date';
        print "Output from PHP script: $string";
?>

A entrada do crontab do php

* * * * * php /home/users/l/j/ljames/test.php >> /tmp/date.out

Você pode examinar a saída com:

$ tail -f /tmp/date.out
Output from PHP script: Fri Feb  3 14:46:01 EST 2017

Output from PHP script: Fri Feb  3 14:47:01 EST 2017

Output from PHP script: Fri Feb  3 14:48:01 EST 2017

A saída verifica se o crontab executará seus scripts php. Ele mostra que o culpado é o script real, que deve ser depurado para funcionar adequadamente fora do cron primeiro. O provável culpado seria a lista de caminhos do ambiente.

Nota:
Seu sistema com seus scripts de servidor da web executados como usuário www-data será mais seguro do que se fossem executados como você ou root. Se eles fossem como você, o script teria acesso a todos os itens aos quais você tem acesso e, se o seu servidor web estivesse comprometido, ele poderia até ter acesso root com sudo . Com os scripts do servidor da web run-as www-data , um servidor comprometido poderá acessar apenas o servidor. Que, se feito em backup, seria mais fácil de corrigir do que ter que lidar com todo o seu servidor.

    
por L. D. James 03.02.2017 / 19:23
2

Isso porque, tradicionalmente (e por motivos de segurança muito bons), o usuário www-data não tem permissão para fazer nada além de veiculação na web. Sem logins, sem tarefas cron, nada.

$ getent passwd www-data
www-data:x:33:33:www-data:/var/www:/usr/sbin/nologin

Repense o fluxo de trabalho, não tente executar as coisas como www-data .

    
por waltinator 03.02.2017 / 19:17
0

Eu encontrei a solução. Eu verifiquei os cronlogs digitando

sudo grep CRON /var/log/syslog

E eu vi a mensagem “(CRON) info (No MTA installed, discarding output)”

Isso significa que eu tive que enviar e-mail instalado.

Então eu corri sudo apt-get install postfix e agora tudo está funcionando.

    
por Umair 04.02.2017 / 15:28