
Estou fazendo esta pergunta depois de destruir regiamente uma caixa Linux. Deixe-me dar algumas informações básicas para que você saiba de onde venho.
Atualmente tenho (bem... tinha) uma caixa RedHat Linux rodando Apache com Phusion Passenger adicionada para rodar Ruby Apps no Apache. O aplicativo atua como um serviço para fornecer regularmente arquivos em cache a quiosques na área de Cincinnati. O aplicativo da web funcionou muito bem e a única parte que restou foi configurar uma tarefa cron para recuperar todas as informações que precisavam ser armazenadas em cache e empacotá-las em alguns pacotes de atualização diferentes para servir aos quiosques. Para conseguir isso, escrevi um script Ruby que lidaria com a busca e o empacotamento de dados. Para configurar a tarefa cron, usei apenas o crontab integrado. O script ficou assim:
#!/bin/bash
cd ../lib
ruby pdf_cache.rb
ruby pdf_prepare.rb
ruby rss_cache.rb
ruby nightly-pack.rb
cd ..
chown -R www.www *
Este script estava localizado na pasta cron e a estrutura de diretórios era assim:
.
|-- cron
|-- feeds
|-- lib
| `-- trash
|-- logs
|-- nightly-packs
|-- pdf
| `-- tank
|-- public
`-- tmp
e corri crontab -e
com root
o seguinte conteúdo:
0 3 * * * /usr/local/apache2/ruby_projects/kiosk/cron/schedule_job
Que deve executar o script todos os dias às 3h. No dia seguinte, após agendar esta tarefa cron, tive uma surpresa muito infeliz. A tarefa cron foi executada na raiz e presumo que a maioria dos comandos falhou, com exceção da chmod -R www.www *
mudança de propriedade de tudo no sistema para o www
usuário.
Minha pergunta é; qual é a maneira correta de implementar uma tarefa cron e de qual contexto a tarefa cron é executada? Percebo agora que provavelmente não deveria executar isso na root
conta e não tenho certeza de como executá-lo na www
conta, pois esse usuário não tem shell e você não pode fazer su
isso com êxito www
.
Responder1
Aposto que você poderia simplesmente fornecer um shell ao usuário, apenas limitar a capacidade de acessá-lo remotamente e suas permissões.
As tarefas Cron são executadas sob os usuários que criaram a tarefa Cron, e é por isso que ela é executada como root
.
Responder2
Outra sugestão: adicione -e
à linha shebang em scripts como este (ou seja, #!/bin/bash -e
). Isso fará com que o script seja encerrado se algum comando falhar. Isso não garante que você não terá surpresas desagradáveis, mas evitará que o script saia completamente dos trilhos (por assim dizer) e evitará muitos tipos de falhas de reação em cadeia.
Responder3
A maneira correta de fazer isso é 'su -', configure seu cronjob como este usuário. Então ele será executado como este usuário. Ou, dependendo de qual daemon cron você está usando, pode haver um sexto campo para definir o usuário.
Espero que isto ajude. Existem outros hacks, mas é sempre melhor fazê-lo funcionar corretamente.