crontab sendo executado como um usuário específico

19

Eu preciso executar um script diariamente. O script deve ser executado como um usuário específico (por exemplo, usuário1) e não como raiz. Então, coloquei o arquivo cron em /etc/cron.d e coloquei o nome do usuário na linha (2ª coluna). Mas dá um erro dizendo que o comando não foi encontrado. Eu suspeito que o script não foi executado como o ambiente do usuário1. Perdi algo?

Sam Kong
fonte
3
Você pode nos mostrar a entrada do crontab que está usando, por favor?
precisa saber é o seguinte

Respostas:

33

Somente /etc/crontabe os arquivos /etc/cron.d/têm um campo de nome de usuário. Nesse arquivo, você pode fazer isso:

1 1 * * * username /path/to/your/script.sh

No crontab do root, sudo crontab -evocê pode usar:

1 1 * * * su username -c "/path/to/your/script.sh"

Ou você pode usar o crontab real do usuário assim:

sudo crontab -u username -e

A segunda coluna em qualquer arquivo crontab é para a hora em que você deseja que o trabalho seja executado. Você quis dizer o sexto campo?

Ladadadada
fonte
O arquivo em /etc/cron.d usa um argumento do usuário: help.ubuntu.com/community/CronHowto#Advanced_Crontab e por que você está executando o "sudo su" se estiver executando como root? De qualquer forma, você deseja que "su -l" use o ambiente de login para o usuário, pois esse é provavelmente um problema PATH, a partir da descrição do problema.
Cjc 23/01/12
Os arquivos no /etc/cron.d não são uma extensão do / etc / crontab? Nos sistemas, tenho que entregar todos os arquivos em /etc/cron.d com um nome de usuário especificado.
precisa saber é o seguinte
Ah, de fato. /etc/cron.d/arquivos fazem parte /etc/crontab. sudotambém não faz sentido. Vou remover essa parte.
Ladadadada 23/01
2
Em relação a colocar o sudo no crontab: (a) sudo su... geralmente é desnecessário; sudo -u <user> <command>geralmente é suficiente. (b) o sudo bloqueará alguns sistemas se não houver um TTY conectado (como quando executado pelo cron). Isso pode ser corrigido no seu arquivo sudoers.
tylerl
4

Pode ser necessário definir o PATH para esse usuário, se o executável que você estiver usando estiver em, digamos, / usr / local / bin. Para definir o PATH, coloque algo assim antes dos cronjobs:

PATH=/bin:/usr/bin:/usr/local/bin

*/5 * * * * user1 sample_executable

A outra maneira é especificar completamente o caminho para sample_executable em seu cronjob, portanto:

*/5 * * * * user1 /path/to/sample_executable

Se sample_executable referir os executáveis ​​que não estão no PATH padrão, você deverá usar a primeira opção.

cjc
fonte
1

O diretório típico para o usuário crontabs está em / var / spool / cron / crontabs. O formato do arquivo é o que não inclui o nome de usuário. Os crontabs do usuário pertencem ao usuário e recebem o nome do usuário no modo 0600. É melhor lidar com isso gravando seu arquivo de guia e usando-o crontab -u username filenamepara configurar as entradas cron que você deseja para esse usuário.

Jeff Ferland
fonte