Crontab excluído?

11

Em vez de digitar "crontab -e", digitei acidentalmente "crontab" e fiquei preso no meio de um processo, então abortei o processo. Agora, quando vou ao crontab -e, fica totalmente em branco. Isso não é nada bom. Se não conseguir recuperá-lo, precisarei reescrevê-lo.

Existe alguma maneira de:

  1. recuperar meus trabalhos de crontab? eles estão na memória em algum lugar? Onde estão os arquivos crontab específicos da conta localizados no linux? OU
  2. obter um log de todas as coisas que o cron fez, para que eu possa fazer engenharia reversa no meu arquivo crontab. Eu não olhava há muito tempo?
user12832
fonte
3
Apenas restaure-o a partir do backup mais recente do sistema.
David Heffernan
Se você digitou crontab -r como eu fiz e encontrou esse encadeamento, é possível recuperar o comando lendo os logs em / var / log. No meu caso syslog.1 tinha tudo que eu precisava
StackUnder

Respostas:

14

crontabsem argumentos lê um arquivo crontab a partir da entrada padrão. Por exemplo, você pode usar:

 echo "* * * * *  run-this-every-minute" | crontab

Depois que você derruba seu crontab (ou seja, crontab -lnão mostra nada), não há uma boa maneira de recuperá-lo.

No meu sistema (Ubuntu 11.04), os crontabs pessoais são armazenados /var/spool/cron/crontabs/<USER>- mas é isso que você derrotou, para que não seja bom. (O caminho pode ser diferente no seu sistema.)

Eu vejo entradas /var/log/syslogpara comandos executados por cron; você pode reconstruir seu crontab a partir disso (ou o equivalente do seu sistema, se houver), mas será tedioso.

Aqui está o que eu faço para evitar esse tipo de problema:

Eu mantenho meu crontab em um arquivo separado, mantido em um sistema de controle de origem. Eu o instalo apenas executando

crontab filename

Eu nunca uso crontab -e. Se acidentalmente derrotar meu crontab, posso apenas recarregá-lo do arquivo. (Bem, quase nunca; às vezes eu crontab -efaço alterações temporárias, sabendo que posso restaurar a versão atual posteriormente.)

Keith Thompson
fonte
@mountainclimber: Eu discordo. Para salvar seu crontab, use crontab -l > filename. Para restaurá-lo crontab filename,. Use a interface fornecida pelo sistema; não vá pelas costas e manipule os arquivos do sistema. Por um lado, atualizar o arquivo não necessariamente indica ao sistema para relê-lo; o crontabcomando vai. Por outro lado, pode haver diferenças entre o que está no arquivo e a saída de crontab -l; no Ubuntu, o arquivo possui algumas linhas de comentários extras, aconselhando-o a não editá-lo.
Keith Thompson
Vou excluir meu outro comentário. Novo comentário: Keith menciona o caminho /var/spool/cron/crontabs/<USER>. No SUSE, meu caminho é um pouco diferente (nota extra barra): /var/spool/cron/cron/tabs/<USER>. Pensei em mencionar para iniciantes o cron e o linux como eu. A resposta de Keith está correta.
mountainclimber
5

Script para recuperação completa do crontab

Eu criei um script PHP que faz uma recuperação completa do seu crontab, com base no log.

Ele gera uma única instância de cada comando cron executado pelo usuário na última semana.

Eu coloquei aqui

https://github.com/dangreenisrael/recover_crontab

Aqui está uma amostra de saída:

perl ~/sorttv/sorttv.pl

/usr/local/bin/flexget

bash ~/scripts/sort_sports.sh

~/scripts/play_recently_added.sh
Dan Green-Leipciger
fonte
1

Sinto muito, mas não posso deixar de perguntar o óbvio: por que não restaurá-lo a partir do backup?

Desculpe, vejo que já foi sugerido.

Lee-Man
fonte
0

Se sua variável de ambiente EDITOR for EDITOR = vi, tente

vi -r

para recuperar a sessão. Não grave diretamente a sessão salva, se tiver uma, no diretório crontab. Use-o como um guia para recriar seu crontab usando

crontab -e

Nota: Como você não especificou um sistema operacional, o Solaris e outros sistemas operacionais UNIX não reconhecem alterações nos arquivos crontab, exceto aqueles criados por meio do crontab -e. Se bem me lembro, o Linux sim.

jim mcnamara
fonte
Não há sessão para recuperar; o OP digitou em crontabvez de crontab -e. Veja minha resposta para uma maneira melhor (IMHO) de manter seu crontab.
Keith Thompson
0

Ótima resposta de @Keith Thompson - boa idéia para reconstruir a partir de / var / log / syslog!

Eu também acidentalmente derrubei meu crontab de usuário, mas consegui reconstruí-lo com o seguinte script-fu

mkdir ~/syslog
sudo cp /var/log/syslog* ~/syslog/
sudo chmod 777 ~/syslog/*
cat ~/syslog/* | grep "(username)" | grep -o "CMD.*" | sort | uniq

onde o nome de usuário deve ser substituído pelo usuário cujo crontab você deseja reconstruir.

Observe que você pode precisar compactar o conteúdo dos seus arquivos /var/log/syslog.x.gz primeiro se os logs tiverem sido compactados (o ubuntu fecha o syslog.2 +)

Isso também obterá apenas comandos que ainda estão nos logs, que durarão aproximadamente os últimos 7 dias ... portanto, se você tiver uma tarefa mensal que não foi executada ... essa provavelmente desapareceu

Jamie Cook
fonte