Crontab usunięty?

11

Zamiast pisać „crontab -e” Przypadkowo wpisałem „crontab” i utknąłem w trakcie procesu, więc przerwałem proces. Teraz, gdy idę do crontab -e, jest całkowicie pusty. To wcale nie jest dobre. Jeśli nie mogę go odzyskać, będę musiał go przepisać.

Czy jest jakiś sposób na:

  1. odzyskać moją pracę w crontabie? czy są gdzieś w pamięci? Gdzie znajdują się pliki crontab specyficzne dla konta w systemie Linux? LUB
  2. otrzymuję dziennik wszystkich rzeczy, które zrobił cron, więc mogę odtworzyć mój plik crontab. Dawno na to nie patrzyłem?
użytkownik12832
źródło
3
Wystarczy przywrócić go z najnowszej kopii zapasowej systemu.
David Heffernan
Jeśli wpiszesz crontab -r tak jak ja i znalazłem ten wątek, możesz odzyskać komendę czytając logi z / var / log. W moim przypadku syslog.1 miał wszystko, czego potrzebowałem
StackUnder

Odpowiedzi:

14

crontabbez argumentów odczytuje plik crontab ze standardowego wejścia. Na przykład możesz użyć:

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

Po zablokowaniu crontab (tzn. crontab -lNic nie pokazuje) nie ma dobrego sposobu na odzyskanie go.

W moim systemie (Ubuntu 11.04) przechowywane są osobiste tabele crontab /var/spool/cron/crontabs/<USER>- ale to właśnie je zablokowałeś, więc nic ci to nie da. (Ścieżka może być inna w systemie).

Widzę wpisy /var/log/syslogdla poleceń wykonywanych przez cron; możesz być w stanie zrekonstruować swój crontab z tego (lub odpowiednika twojego systemu, jeśli taki istnieje), ale będzie to nużące.

Oto, co robię, aby uniknąć tego rodzaju problemów:

Trzymam mój plik crontab w osobnym pliku, utrzymywanym w systemie kontroli źródła. Instaluję to tylko przez uruchomienie

crontab filename

Nigdy nie używam crontab -e. Jeśli przypadkowo zablokuję mój plik crontab, mogę po prostu ponownie go załadować z pliku. (Cóż, prawie nigdy; czasami używam crontab -etymczasowych zmian, wiedząc, że później mogę przywrócić bieżącą wersję).

Keith Thompson
źródło
@mountainclimber: Nie zgadzam się. Aby zapisać plik crontab, użyj crontab -l > filename. Aby przywrócić go crontab filename. Użyj interfejsu dostarczonego przez system; nie idź za jego plecami i nie manipuluj plikami systemowymi. Po pierwsze, aktualizacja pliku niekoniecznie każe systemowi go ponownie przeczytać; crontabkomenda będzie. Po drugie, mogą występować różnice między zawartością pliku a danymi wyjściowymi crontab -l; w systemie Ubuntu plik zawiera dodatkowe wiersze komentarza odradzające jego edytowanie.
Keith Thompson
Usunę mój inny komentarz. Nowy komentarz: Keith wspomina ścieżkę /var/spool/cron/crontabs/<USER>. Na SUSE, moja droga jest nieco inny (uwaga dodatkowy ukośnik) /var/spool/cron/cron/tabs/<USER>. Pomyślałem, że wspomnę o tym dla początkujących cron i Linux takich jak ja. Odpowiedź Keitha jest poprawna.
wspinacz górski
5

Skrypt do pełnego odzyskiwania crontab

Zrobiłem skrypt PHP, który dokonuje pełnego odzyskiwania twojego crontab, na podstawie dziennika.

Wyświetla pojedyncze wystąpienie każdej komendy cron uruchomionej przez użytkownika przez ostatni tydzień.

Położyłem to tutaj

https://github.com/dangreenisrael/recover_crontab

Oto przykładowy wynik:

perl ~/sorttv/sorttv.pl

/usr/local/bin/flexget

bash ~/scripts/sort_sports.sh

~/scripts/play_recently_added.sh
Dan Green-Leipciger
źródło
1

Przykro mi, ale nie mogę przestać pytać o oczywiste: dlaczego nie przywrócić go z kopii zapasowej?

Przepraszam, widzę, że to już sugerowano.

Lee-Man
źródło
0

Jeśli zmienna środowiskowa EDITOR to EDITOR = vi, spróbuj

vi -r

odzyskać sesję. Nie zapisuj bezpośrednio zapisanej sesji, jeśli ją dostaniesz, do katalogu crontab. Użyj go jako przewodnika do odtworzenia pliku crontab

crontab -e

Uwaga: Ponieważ nie określono systemu operacyjnego, Solaris i inne systemy operacyjne UNIX nie rozpoznają zmian w plikach crontab, z wyjątkiem tych utworzonych za pomocą crontab -e. Jeśli dobrze pamiętam, Linux tak.

Jim Mcnamara
źródło
Nie ma sesji do odzyskania; OP napisał crontabraczej niż crontab -e. Zobacz moją odpowiedź na lepszy (IMHO) sposób na utrzymanie twojego crontab.
Keith Thompson
0

Świetna odpowiedź od @Keith Thompson - dobry pomysł na rekonstrukcję z / var / log / syslog!

Również przypadkowo zablokowałem crontab mojego użytkownika, ale udało mi się go zrekonstruować za pomocą następującego skryptu fu

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

gdzie nazwę użytkownika należy zastąpić użytkownikiem, którego crontab chcesz zrekonstruować.

Zauważ, że może być konieczne najpierw rozpakowanie zawartości plików /var/log/syslog.x.gz, jeśli dzienniki zostały skompresowane (ubuntu zamyka syslog.2 +)

Spowoduje to również otrzymanie poleceń, które nadal znajdują się w dziennikach, co potrwa około 7 ostatnich dni ... więc jeśli masz miesięczne zadanie, które nie zostało uruchomione ... to prawdopodobnie go nie ma

Jamie Cook
źródło