Como encontrar um Crontab fugitivo

17

Alguns anos atrás, eu configurei um trabalho cron para executar ping automaticamente em um URL a cada minuto como parte de um sistema de monitoramento (isso é uma simplificação excessiva, mas serve para essa pergunta). Por ser uma pessoa horrível, não a documentei em lugar nenhum.

Hoje, anos depois, comecei a ter problemas com o aplicativo na outra extremidade da URL que estava sendo pingada. Corrigi-o, mas depois percebi que não fazia ideia de onde vinha esse trabalho cron .

Existe uma maneira de pesquisar rapidamente ou eliminar todas as crontabs em um sistema específico? Eu tenho acesso root, portanto, as permissões não são um problema. Eu sempre fui usuário cron, nunca examinei muito profundamente sua implementação, mas meus instintos * nix dizem que deve haver um grupo de arquivos de texto em algum lugar que contenha todos os crontabs. Só não sei onde eles estariam, e se eu investigasse, teria medo de encontrar alguns, mas não todos, ou perder algumas nuances estranhas do sistema.

Além disso, eu percebo que com acesso root eu poderia

  1. Obtenha uma lista de todos os usuários no sistema
  2. su como usuário
  3. crontab -l
  4. Repita com todos os usuários

mas estou procurando algo um pouco menos manual (e procurando aprender algo sobre a implementação do cron)

Alan Storm
fonte
2
pode ser necessário consultar este link - stackoverflow.com/questions/134906/…
Daniel t.

Respostas:

20

Existem apenas alguns lugares que os crontabs podem ocultar:

  • /etc/crontab
  • /etc/cron.d/*
  • /etc/crond.{hourly,daily,weekly,monthly}/*
    estes são chamados /etc/crontab, então talvez um asterisco neste
  • /var/spool/cron/*(às vezes /var/spool/cron/crontabs/*)

Certifique-se de verificar attambém, o que mantém seus empregos em /var/spool/at/ou/var/spool/cron/at*/

Além disso, em vez de

su <user>
crontab -l

Apenas faça o seguinte:

crontab -lu <user>
tylerl
fonte
8

Os Crontabs vivem /etc/crontabe (com muitas implementações) seus componentes em /etc/cron.*/*(todos editados pela raiz) e em /var/spool/cron/*(crontabs dos usuários).

Se você tiver problemas para localizar o trabalho incorreto, outra abordagem é investigar um enquanto está em andamento. Por exemplo, você pode adicionar uma regra de firewall para registrar o ID do usuário do processo de abertura de conexões example.comna porta 80:

iptables -A OUTPUT -p tcp --syn -d example.com --dport 80 -j LOG --log-prefix "[->example.com] " --log-uid

Se o trabalho estiver usando um aplicativo como pingou curl, sombreie o binário usual por um wrapper que registra informações sobre o que está sendo usado, com um script como este em /usr/local/bin:

#!/bin/sh
{
  date
  echo "$0" "$@"
  ps -p $PPID
  echo
} >>"/tmp/$(basename "$0").log"
exec "/usr/bin/$(basename "$0")" "$@"
Gilles 'SO- parar de ser mau'
fonte
+1 porque mostra como obter o problema para se explicar!
31413 Joe
6

A maneira rápida e suja:

grep -r ping /var/spool/cron/crontabs

O local exato em que os crontabs são armazenados pode variar de sistema para sistema, mas geralmente está dentro /var/spoole tem crontabalgum lugar no nome.

Observe também que muitos sistemas possuem crontabs do sistema (como em /etc/crontab, /etc/cron.d) alguns dos quais podem chamar mais scripts como /etc/cron.hourly, .daily...

Stéphane Chazelas
fonte
4

Isso soa como um cronjob criado pelo crontab. Nem todos os crontabs têm um -uswitch, mas para o GNU / Linux ele está disponível. Esta é uma linha útil para listar todos os cronjobs criados pelo crontab.

for user in $(awk -F':' '{ print $1}' /etc/passwd); do crontab -u $user -l; done

(Execute como root.)

Christopher
fonte
2

Se tudo mais falhar, você pode criar um honeypot com a URL solicitada - por exemplo, servir um arquivo grande ou algo assim - e procurar o processo que está aguardando o recebimento dos dados e, em seguida, procurar seu PPID.

sendmoreinfo
fonte
2

Qualquer sistema decente deve explicar a localização precisa dos crontabs na página de manual (geralmente na FILESseção próxima ao final e também para outros daemons).

No meu sistema, por exemplo, cron(8)contém o seguinte:

 FILES
      /etc/crontab          system crontab file
      /var/cron/atjobs      directory containing at(1) jobs
      /var/cron/log         cron's log file
      /var/cron/tabs        directory containing individual crontab files
      /var/cron/tabs/.sock  used by crontab(1) to tell cron to check for
                            crontab changes immediately

E eu segundo o conselho de Tylerl de também procurar atemprego enquanto você está nisso.

Vucar Timnärakrul
fonte
2

Abordando o contrário: o cron mantém um registro do que está fazendo, precisamente para evitar esse tipo de problema em primeiro lugar. No meu sistema, o log é mantido /var/cron/loge fica assim:

==> /var/cron/log <==
Oct 25 00:21:01 fortress cron[20232]: (vucar) CMD (/home/vucar/lighttpd-watchdog)

Essa linha me diz que a instância cron com PID 20232 na máquina fortressestá sendo executada /home/vucar/lighttpd-watchdogem nome do usuário vucar. Um sistema bem-comportado possui apenas um cron em execução, portanto isso será direto.

Isso também funciona para attrabalhos, pois eles geralmente são entregues ao cron de qualquer maneira:

==> /var/cron/log <==
Oct 25 00:28:01 fortress cron[31282]: (vucar) ATJOB (1414189680.c)

Os trechos são de um sistema BSD, mas o conceito geral provavelmente é o mesmo em qualquer outro lugar.

Vucar Timnärakrul
fonte