Comment trouver un Crontab fugitif

17

Il y a quelques années, j'ai configuré un travail cron pour envoyer automatiquement une requête ping à une URL toutes les minutes dans le cadre d'un système de surveillance (c'est une simplification excessive, mais cela suffira pour cette question). Parce que je suis une personne horrible, je n'ai documenté cela nulle part.

Aujourd'hui, des années plus tard, j'ai commencé à avoir des problèmes avec l'application à l'autre extrémité de l'URL qui fait l'objet d'un ping. Je l'ai corrigé, mais j'ai réalisé, je n'ai aucune idée d'où vient ce travail cron .

Existe-t-il un moyen de rechercher rapidement ou de supprimer toutes les crontabs d'un système particulier? J'ai un accès root, donc les autorisations ne sont pas un problème. Je n'ai jamais été un utilisateur de cron, je n'ai jamais regardé trop en détail son implémentation, mais mes instincts * nix disent qu'il doit y avoir un groupe de fichiers texte quelque part qui contient tous les crontabs. Je ne sais tout simplement pas où ils seraient, et si j'y creusais, j'aurais peur d'en trouver certains, mais pas tous, ou de manquer une nuance étrange du système

De plus, je me rends compte avec un accès root que je

  1. Obtenez une liste de tous les utilisateurs du système
  2. su en tant qu'utilisateur
  3. crontab -l
  4. Répétez avec tous les utilisateurs

mais je cherche quelque chose d'un peu moins manuel (et cherche à apprendre quelque chose sur l'implémentation de cron)

Alan Storm
la source
2
vous devrez peut-être consulter ce lien - stackoverflow.com/questions/134906/…
Daniel t.

Réponses:

20

Il n'y a que quelques endroits que les crontabs peuvent cacher:

  • /etc/crontab
  • /etc/cron.d/*
  • /etc/crond.{hourly,daily,weekly,monthly}/*
    ceux-ci sont appelés à partir de /etc/crontab, alors peut-être un astérisque sur ce
  • /var/spool/cron/*(parfois /var/spool/cron/crontabs/*)

Assurez-vous de vérifier atégalement, ce qui maintient ses emplois /var/spool/at/ou/var/spool/cron/at*/

Aussi, au lieu de

su <user>
crontab -l

Faites juste ceci:

crontab -lu <user>
tylerl
la source
8

Crontabs vit dans /etc/crontab(et avec de nombreuses implémentations) ses composants dans /etc/cron.*/*(tous édités par root) et dans /var/spool/cron/*(crontabs des utilisateurs).

Si vous avez du mal à localiser le travail incriminé, une autre approche consiste à en rechercher un pendant qu'il se déroule. Par exemple, vous pouvez ajouter une règle de pare-feu pour consigner l'ID utilisateur du processus ouvrant les connexions sur example.comle port 80:

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

Si le travail utilise une application telle que pingor curl, masquez le binaire habituel par un wrapper qui enregistre des informations sur ce qui l'utilise, avec un script comme celui-ci dans /usr/local/bin:

#!/bin/sh
{
  date
  echo "$0" "$@"
  ps -p $PPID
  echo
} >>"/tmp/$(basename "$0").log"
exec "/usr/bin/$(basename "$0")" "$@"
Gilles 'SO- arrête d'être méchant'
la source
+1 car il montre comment faire en sorte que le problème s'explique!
Joe
6

La manière rapide et sale:

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

L'emplacement exact où les crontabs sont stockés peut varier d'un système à l'autre, mais il se trouve généralement dans /var/spoolet a crontabquelque part dans le nom.

Notez également que de nombreux systèmes ont des crontabs système (comme dans /etc/crontab, /etc/cron.d) dont certains peuvent appeler plus de scripts comme /etc/cron.hourly, .daily...

Stéphane Chazelas
la source
4

Cela ressemble à un cronjob créé par crontab. Tous les crontabs n'ont pas de -ucommutateur, mais pour GNU / Linux, il est disponible. Il s'agit d'une ligne pratique pour répertorier tous les cronjobs créés par crontab.

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

(Exécuter en tant que root.)

Christophe
la source
2

Si tout le reste échoue, vous pouvez créer un pot de miel à partir de l'URL qu'il demande - c'est-à-dire servir un gros fichier ou quelque chose - et rechercher le processus qui attend de recevoir les données, puis rechercher son PPID.

sendmoreinfo
la source
2

Tout système décent doit expliquer l'emplacement précis des crontabs dans la page de manuel (généralement dans la FILESsection près de la fin, ainsi que pour les autres démons).

Sur mon système, par exemple, cron(8)contient les éléments suivants:

 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

Et j'appuie le conseil de tylerl de vérifier également les atemplois pendant que vous y êtes.

Vucar Timnärakrul
la source
2

L'approche dans l'autre sens: cron tient un journal de ce qu'il fait, précisément pour éviter ce genre de problèmes en premier lieu. Sur mon système, le journal est conservé dans/var/cron/log et ressemble à ceci:

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

Cette ligne me dit que l'instance cron avec PID 20232 sur la machine fortress s'exécute /home/vucar/lighttpd-watchdogau nom de l'utilisateurvucar . Un système qui se comporte bien n'a qu'un seul cron en cours d'exécution, ce sera donc simple.

Cela fonctionne également pour at emplois, car ils sont généralement simplement remis à cron de toute façon:

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

Les extraits proviennent d'un système BSD, mais le concept général est très probablement le même partout ailleurs.

Vucar Timnärakrul
la source