Estou tentando automatizar a atualização do repositório de controle de versão no crontab. O script a seguir /home/usr/mrbean/bin/update.sh
funciona na linha de comando interativa do Bash:
#!/bin/bash
ROOTPATH="/home/user/mrbean/temp/"
cd $ROOTPATH
SSHTMPFILE="${ROOTPATH}ssh-agent.cf"
ssh-agent -s | head -n 2 > "$SSHTMPFILE"
function killsshagent {
/bin/kill $SSH_AGENT_PID
}
trap killsshagent EXIT
if [ -f "$SSHTMPFILE" ]; then
source "$SSHTMPFILE"
ssh-add
rm "$SSHTMPFILE"
fi
killsshagent
if [ `hostname` == "mrbeancomp.local" ]; then
REPODIR="/home/usr/mrbean/repo/"
cd $REPODIR
cvs update -dP > "$HOME/log/log.txt"
fi
Eu então adiciono
@hourly /home/usr/mrbean/bin/update.sh
O script funciona sozinho quando invocado no shell Bash interativo, mas não via crontab. Dá erros e é enviado para o correio do sistema /var/mail/mrbean
:
Permission denied, please try again.
Permission denied, please try again.
Permission denied (publickey,gssapi-with-mic,password).
cvs [update aborted]: end of file from server (consult above messages if any)
[Atualizar]
killsshagent
adicionado no programa para ssh-agent
não ficar pendurado.
[Atualizar]
Tentei um programa adaptado em um repositório Git e tive o mesmo problema. Bean não tem permissão para abandonar imediatamente este repositório CVS e mudar para um novo repositório Git.
[Atualizar]
Eu tenho vários arquivos de identidade em $HOME/.ssh/
. É possível que, ao executar no crontab, eu precise especificar qual arquivo de identidade usar? Se sim, como?
Responder1
Suponho que (não sou um especialista em Unix, mas tive um problema semelhante com tarefas cron que não estavam em execução), com qual usuário você está executando a tarefa? Esse usuário tem todas as permissões necessárias para acessar tudo que você precisa?
Suspeito que não (o erro diz isso! :-D).
Se você sair do usuário ativo e fizer login como um usuário diferente, o script bash ainda funciona? Se não, isso ajuda.
A solução que usamos foi executar a tarefa como um usuário específico.
Parece que existem várias maneiras de fazer isso (nem sempre). Não posso comentar os méritos de um em detrimento do outro - isso cabe a você decidir. Como especificar no crontab por qual usuário executar o script?