Todos os crontabs dos usuários são armazenados em um único diretório, e os usuários não podem acessar esse diretório diretamente, eles precisam usar o comando privilegiado crontab
.
Em vez de armazenar o arquivo crontab real no controle de versão, escreva um commit hook que executa crontab
para enviar a versão mais recente.
crontab "$HOSTNAME.crontab"
O gancho mais simples seria um post-commit
hook. Execute git rev-parse --abbrev-ref HEAD
para encontrar o ramo atual e git show --format=format: --name-status HEAD
.
#!/bin/sh
commit=$(git rev-parse HEAD)
branch=$(git rev-parse --name-status "$commit")
git show --format=format: --name-status "$commit" |
while read -r status filename; do
if [ "$branch" = "master" ] &&
[ "$status" = "A" -o "$status" = "M" ] &&
[ "$filename" = "crontabs/$HOSTNAME.crontab" ]; then
crontab "$filename"
fi
done
Isso não manipula mesclagens ou reorganizações e não registra nada no histórico se crontab
falhar. Há um pouco de confronto de paradigma aqui, pois o git tem fundamentalmente vários branches, mas há apenas um único crontab em uma determinada máquina em um determinado momento. Para maior robustez, você pode preferir ter uma ramificação dedicada para crontabs ao vivo e mesclar a essa ramificação quando você alterar o arquivo crontab em sua ramificação de trabalho.