Crontab dihapus?

11

Alih-alih mengetik "crontab -e" saya tidak sengaja mengetik "crontab" dan terjebak di tengah-tengah proses jadi saya membatalkan proses. Sekarang ketika saya pergi ke crontab -e semuanya kosong. Ini tidak baik sama sekali. Jika saya tidak bisa mendapatkannya kembali, saya harus menulis ulang.

Apakah ada cara untuk:

  1. dapatkan kembali pekerjaan crontab saya? apakah mereka ada di memori di suatu tempat? Di mana file crontab khusus akun berada di linux? ATAU
  2. dapatkan log dari semua hal yang telah dilakukan cron, jadi saya bisa merekayasa balik file crontab saya. Saya sudah lama tidak melihatnya?
pengguna12832
sumber
3
Cukup kembalikan dari cadangan sistem terbaru Anda.
David Heffernan
Jika Anda mengetikkan crontab -r seperti yang saya lakukan dan menemukan utas ini, Anda dapat memulihkan perintah membaca log dari / var / log. Dalam kasus saya syslog.1 memiliki semua yang saya butuhkan
StackUnder

Jawaban:

14

crontabtanpa argumen membaca file crontab dari input standar. Misalnya, Anda dapat menggunakan:

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

Setelah Anda memecahkan crontab Anda (yaitu, crontab -ltidak menunjukkan apa-apa), tidak ada cara yang baik untuk mendapatkannya kembali.

Di sistem saya (Ubuntu 11.04), crontab pribadi disimpan /var/spool/cron/crontabs/<USER>- tetapi itulah yang Anda musuhi, sehingga tidak ada gunanya bagi Anda. (Jalannya bisa berbeda di sistem Anda.)

Saya melihat entri /var/log/sysloguntuk perintah yang dijalankan oleh cron; Anda mungkin dapat merekonstruksi crontab Anda dari itu (atau setara dengan sistem Anda, jika ada), tetapi itu akan membosankan.

Inilah yang saya lakukan untuk menghindari masalah seperti ini:

Saya menyimpan crontab saya di file terpisah, dipelihara dalam sistem kontrol sumber. Saya menginstalnya hanya dengan menjalankan

crontab filename

Saya tidak pernah menggunakan crontab -e. Jika saya secara tidak sengaja memecahkan crontab saya, saya bisa memuatnya kembali dari file. (Yah, hampir tidak pernah; Kadang-kadang saya gunakan crontab -euntuk membuat perubahan sementara, mengetahui bahwa saya dapat mengembalikan versi saat ini nanti.)

Keith Thompson
sumber
@mountainclimber: Saya tidak setuju. Untuk menyimpan crontab Anda, gunakan crontab -l > filename. Untuk mengembalikannya crontab filename,. Gunakan antarmuka yang disediakan sistem; jangan pergi ke belakang dan memanipulasi file sistem. Untuk satu hal, memperbarui file tidak harus memberitahu sistem untuk membacanya lagi; yang crontabperintah akan. Untuk yang lain, mungkin ada perbedaan antara apa yang ada di file dan output dari crontab -l; di Ubuntu, file memiliki beberapa baris komentar tambahan yang menyarankan Anda untuk tidak mengeditnya.
Keith Thompson
Saya akan menghapus komentar saya yang lain. Komentar baru: Keith menyebutkan jalan /var/spool/cron/crontabs/<USER>. Pada SUSE, jalan saya sedikit berbeda (catatan tambahan slash): /var/spool/cron/cron/tabs/<USER>. Kupikir aku akan menyebutkan itu untuk pemula ke cron dan linux seperti aku. Jawaban Keith benar.
pendaki gunung
5

Skrip untuk pemulihan crontab penuh

Saya membuat skrip PHP yang melakukan pemulihan penuh terhadap crontab Anda, berdasarkan log.

Ini output contoh tunggal dari setiap perintah cron dijalankan oleh pengguna selama minggu terakhir.

Saya taruh di sini

https://github.com/dangreenisrael/recover_crontab

Berikut adalah contoh keluaran:

perl ~/sorttv/sorttv.pl

/usr/local/bin/flexget

bash ~/scripts/sort_sports.sh

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

Maaf, tetapi saya tidak bisa tidak bertanya yang jelas: mengapa tidak mengembalikannya dari cadangan?

Eh, maaf, saya sudah melihat yang disarankan.

Lee-Man
sumber
0

Jika variabel lingkungan EDITOR Anda adalah EDITOR = vi, coba

vi -r

untuk memulihkan sesi. Jangan langsung menulis sesi yang disimpan, jika Anda mendapatkannya, ke direktori crontab Anda. Gunakan itu sebagai panduan untuk membuat ulang crontab Anda menggunakan

crontab -e

Catatan: Karena Anda tidak menentukan OS, Solaris dan OS UNIX lainnya tidak mengenali perubahan pada file crontab kecuali yang dibuat melalui crontab -e. Jika saya ingat dengan benar, Linux melakukannya.

jim mcnamara
sumber
Tidak ada sesi untuk pulih; OP mengetik crontabdaripada crontab -e. Lihat jawaban saya untuk cara (IMHO) yang lebih baik untuk menjaga crontab Anda.
Keith Thompson
0

Jawaban bagus dari @Keith Thompson - ide bagus merekonstruksi dari / var / log / syslog!

Saya juga secara tidak sengaja memecahkan crontab pengguna saya tetapi dapat merekonstruksinya dengan skrip-fu berikut

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

di mana nama pengguna harus diganti dengan pengguna yang crontab Anda ingin merekonstruksi.

Perhatikan bahwa Anda mungkin perlu mem-gunzip isi file /var/log/syslog.x.gz Anda terlebih dahulu jika log telah dikompres (ubuntu zip syslog.2 +)

Ini juga hanya akan mendapatkan perintah yang masih ada dalam log, yaitu sekitar 7 hari terakhir ... jadi jika Anda memiliki tugas bulanan yang tidak berjalan ... yang itu mungkin hilang

Jamie Cook
sumber