Onde o usuário crontab está armazenado?

249

Desde que atualizei o crontab do meu usuário, foi eliminado. Esta não é a primeira vez que isso acontece este ano e é uma dor restaurá-lo toda vez.

Gostaria de poder fazer o backup do crontab para o meu usuário, mas para isso preciso saber onde ele está armazenado.

Oli
fonte
4
seria bom se alguém também poderia dar uma razão pela qual é dizimado
Walter Tross
1
@ WalterTross Sim, é bastante irritante. Eu acho que é um efeito colateral da atualização do cronpacote, mas eu concordo - não é algo que deve acontecer.
Oli
Uh, esse cron do usuário não é apagado por atualização do pacote cron!
pl1nk
@ pl1nk Não tenho idéia do que está acabando com isso, mas continua acontecendo. Fantasma na máquina, eu acho.
Oli
As tabelas de usuários são armazenadas em uma área temporária / var / spool / cron / crontabs / $ USER, pois podem ser excluídas na sua próxima inicialização ou atualização.
precisa

Respostas:

325

Na verdade, não é recomendado manipular esses arquivos manualmente. Por crontabpágina de manual:

Cada usuário pode ter seu próprio crontab e, embora
estes sejam arquivos /var/spool/cron/crontabs, eles não
devem ser editados diretamente.

Os arquivos em /var/spoolsão considerados temporários / funcionais, é por isso que provavelmente são excluídos durante uma atualização, embora uma análise mais detalhada dos cronscripts de atualização do pacote possa esclarecer isso.

De qualquer forma, é sempre uma boa prática fazer backup das entradas do cron ou mantê-las em um arquivo no diretório inicial.

Suponho que você esteja usando crontab -epara criar arquivos crontab em tempo real. Nesse caso, você pode obter uma "cópia" do seu arquivo crontab fazendo isso crontab -l. Canalize isso para um arquivo para obter um "backup":

crontab -l > my-crontab

Em seguida, você pode editar esse arquivo my-crontab para adicionar ou modificar entradas e, em seguida, "instalá-lo", fornecendo-o ao crontab:

crontab my-crontab

Isso faz a mesma verificação de sintaxe que crontab -e.

roadmr
fonte
7
crontab -lé mais fácil do que passar /var/spool/cron/crontabs/$USERprincipalmente por causa das permissões bizarras nesse arquivo.
Oli
1
O iptables-savecron. Bom ...
Parthian Shot
4
Talvez devêssemos colocar um crontab para fazer backup automaticamente> :)?
PascalVKooten
4
Fazer uma varredura /var/spool/cron/crontabsé útil quando você deseja organizar ou examinar os crontabs de vários usuários.
dhasenan
1
Ao investigar mistérios em um servidor que não estão familiarizados com, é comum sudo grep -rHin "$string" /etc/cron*(onde corda pode ser um comando como docker, lftp, iptables, etc. É uma boa idéia para verificar crontabs usuário também Isso é o que me levam a este Q & A..sudo grep -rHin "$string" /etc/cron* /var/spool/cron*
de Bruno Bronosky
50

Sua /var/spool/cron/crontabspasta interna é armazenada sob o nome de usuário.

Manula Waidyanatha
fonte
30

Finalmente descobri por que minhas instalações de crontabs e Postfix continuavam quebrando após a inicialização. É uma razão realmente estúpida, mas ...

Eu havia /var/spoolmontado como um tmpfsdrive de RAM.

Parece idiota e é, mas eu segui um dos velhos ajustes do SSD para prolongar a vida do meu SSD. Ao fazê-lo, eu cegamente montado /tmp, /var/tmpe /var/spoolcomo tmpfssem pensar nas repercussões. Eu pensei que /var/spoolera /proc/ou não /run/e que só foi útil durante a duração da sessão. Eu estava claramente errado.

Oli
fonte
8
Deve ser seguro montar /tmpcomo tmpfs, mas não /var/tmpou /var/spool. /tmpé usado para armazenamento temporário que pode ser perdido na reinicialização. /var/tmpé usado para armazenamento temporário que permanecerá após uma reinicialização. E, como você descobriu, /var/spoolé para os dados serem processados, que também permanecerão após uma reinicialização.
thomasrutter
2
Observe também que a contagem de gravações não é mais um problema nos SSDs modernos.
thomasrutter
17

Para listar todos os trabalhos cron de todos os usuários em seu sistema:

for user in $(cut -f1 -d: /etc/passwd)
do
  echo $user
  crontab -u $user -l
done

Uma alternativa para o seu problema seria colocá-los na pasta cron.d e especificar o usuário apropriado por cron, como no exemplo:

00 01 * * * user /home/user/user-script.sh
pl1nk
fonte
se você estiver recuperando o crontab de outra unidade, isso não funcionará porque crontab -uestá sendo executado no seu sistema atual.
JVE999
Embora eu suponha que seja uma linha única, pois cabe em menos de 80 caracteres e seja um pouco legível, geralmente gosto de colocar o código em um formato que permita a uma pessoa copiar ou colar ou colocá-lo em um script (e, em um script, isso não seria uma linha de código). Sugestão de edição ...
Parthian Shot
Além disso, eu estava prestes a transformá-lo em um while read userloop, para lidar com o caso em que o nome de usuário contém espaços, mas aparentemente isso não é um problema. Conjunto muito limitado de caracteres de nome de usuário.
Parthian Shot