Como especificar no crontab por qual usuário executar o script? [fechadas]

176

Eu tenho alguns trabalhos de crontab que são executados na raiz, mas isso me dá alguns problemas. Por exemplo, todas as pastas criadas no processo dessa tarefa cron estão na raiz do usuário e na raiz do grupo. Como posso fazê-lo rodar sob o usuário www-data e agrupar www-data para que, quando executo scripts do meu site, eu possa manipular essas pastas e arquivos?

Meu servidor roda no Ubuntu.
O trabalho atual do crontab é:

*/1 * * * * php5 /var/www/web/includes/crontab/queue_process.php >> /var/www/web/includes/crontab/queue.log 2>&1
arma
fonte

Respostas:

335

Em vez de criar um crontab para ser executado como usuário root, crie um crontab para o usuário que você deseja executar o script. No seu caso, crontab -u www-data -eeditará o crontab para o usuário www-data. Basta colocar seu comando completo e removê-lo do crontab do usuário root.

Mike
fonte
54
Funciona da mesma maneira quando você usa crontab -ecomo um usuário específico.
kulak
7
Mas esse crontab será verificado na inicialização do sistema ou somente quando o usuário efetuar login?
de Bruno Dedo
11
cronOs sistemas on * nix não exigem que um usuário efetue login para executar as tarefas especificadas no crontab de um usuário específico.
3030 Mike
2
Isso também definirá a identificação do grupo conforme solicitado pelo OP? E se o grupo desejado for diferente do grupo principal do usuário?
askyle
49

EDIT: Observe que este método não funcionará com o crontab -e, mas só funcionará se você editar o arquivo / etc / crontab diretamente. Caso contrário, você pode receber um erro como/bin/sh: www-data: command not found

Pouco antes do nome do programa:

*/1 * * * * www-data php5 /var/www/web/includes/crontab/queue_process.php >> /var/www/web/includes/crontab/queue.log 2>&1
Christian Nowak
fonte
Isso faria com que o usuário apache fosse o www-data, certo?
Arma dec
19
Observe que esse método não funciona crontab -e, mas funciona apenas se você editar /etc/crontabdiretamente. Leia o comentário na parte superior deste arquivo para obter mais informações.
Imgx64
5
O usuário pode ser especificado apenas no sistema crontab
James Roth
Tenho alguns trabalhos agendados no sistema crontab. Quando faço sudo crontab -e, vejo os trabalhos. Mas eu abro o arquivo, /etc/crontabnão há trabalhos. Isso é estranho? Além disso, se eu sudo crontab -eadicionar um trabalho com o usuário especificado, ele funcionará?
eNeMetcH
14

Como você está executando o Ubuntu, o seu sistema crontab está localizado em /etc/crontab.

Como usuário root (ou usando o sudo), você pode simplesmente editar este arquivo e especificar o usuário que deve executar este comando. Aqui está o formato das entradas no sistema crontab e como você deve inserir seu comando:

# m h dom mon dow user  command
*/1 * * * * www-data php5 /var/www/web/includes/crontab/queue_process.php >> /var/www/web/includes/crontab/queue.log 2>&1

Obviamente, as permissões para o seu script php e seu arquivo de log devem ser definidas para que o www-datausuário tenha acesso a eles.

pymkin
fonte
Eu pensei que isso deveria ser equivalente a crontab -e; mas não.
zinking
5
Os documentos do Ubuntu recomendaram não editar o arquivo / etc / crontab, pois ele pode ser substituído por atualizações. O crontab -e criará um arquivo cron específico do usuário em / var / spool / cron / crontabs.
Hemm
9

Você também pode tentar usar runuser(como root) para executar um comando como um usuário diferente

*/1 * * * * runuser php5 \
            --command="/var/www/web/includes/crontab/queue_process.php \
                       >> /var/www/web/includes/crontab/queue.log 2>&1"

Veja também: man runuser

Russell E Glaue
fonte
runusernão está incluído no Ubuntu.
Raptor
1
O runuser está na versão mais recente do Ubuntu. Existem também alternativas ao runuser, conforme discutido nesta resposta unix.stackexchange.com/questions/169441/ubuntu-runuser-command , por exemplo, su e sudo.
Russell E Glaue
8

A sugestão de Mike parece o "caminho certo". Me deparei com esse segmento querendo especificar o usuário para executar vncserverna reinicialização e queria manter todos os meus trabalhos cron em um só lugar.

Eu estava recebendo o seguinte erro para o cron VNC:

vncserver: The USER environment variable is not set. E.g.:

No meu caso, eu pude usar sudopara especificar como executar a tarefa.

@reboot sudo -u [someone] vncserver ...
Oliver Moran
fonte
1
Recebi esta mensagem nos logs:sudo: sorry, you must have a tty to run sudo
Renato Gama
@renatoargh Você provavelmente está rodando no RedHat. Dê uma olhada nesta resposta no Unix.SE.
Kaiser #