Crontab bị xóa?


11

Thay vì gõ "crontab -e", tôi vô tình gõ "crontab" và bị kẹt ở giữa một quy trình nên tôi đã hủy bỏ quy trình. Bây giờ khi tôi đến crontab - nó hoàn toàn trống. Điều này không tốt chút nào. Nếu tôi không thể lấy lại, tôi sẽ cần phải viết lại.

Có cách nào để:

  1. có được công việc crontab của tôi trở lại? họ có trong bộ nhớ ở đâu đó không? Tài khoản crontab cụ thể nằm ở đâu trong linux? HOẶC LÀ
  2. có được một bản ghi của tất cả những điều mà cron đã làm, vì vậy tôi có thể đảo ngược kỹ sư tập tin crontab của tôi. Tôi đã không nhìn vào nó trong một thời gian dài?

3
Chỉ cần khôi phục nó từ bản sao lưu hệ thống gần đây nhất của bạn.
David Heffernan

Nếu bạn đã gõ crontab -r như tôi đã làm và tìm thấy chủ đề này, bạn có thể khôi phục lệnh đọc nhật ký từ / var / log. Trong trường hợp của tôi, syslog.1 có mọi thứ tôi cần
StackUnder

Câu trả lời:


14

crontabkhông có đối số đọc tệp crontab từ đầu vào tiêu chuẩn. Ví dụ: bạn có thể sử dụng:

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

Khi bạn đã ghi đè crontab của mình (nghĩa là crontab -lkhông hiển thị gì), không có cách nào tốt để lấy lại.

Trên hệ thống của tôi (Ubuntu 11.04), các crontab cá nhân được lưu trữ trong /var/spool/cron/crontabs/<USER>- nhưng đó là những gì bạn bị ghi đè, do đó sẽ không giúp ích gì cho bạn. (Đường dẫn có thể khác trên hệ thống của bạn.)

Tôi thấy các mục trong /var/log/syslogcho các lệnh được thực hiện bởi cron; bạn có thể xây dựng lại crontab của mình từ đó (hoặc tương đương với hệ thống của bạn, nếu có), nhưng nó sẽ rất tẻ nhạt.

Đây là những gì tôi làm để tránh loại vấn đề này:

Tôi giữ crontab của mình trong một tệp riêng biệt, được duy trì trong một hệ thống kiểm soát nguồn. Tôi cài đặt nó chỉ bằng cách chạy

crontab filename

Tôi không bao giờ sử dụng crontab -e. Nếu tôi vô tình chặn crontab của mình, tôi có thể tải lại từ tệp. (Chà, hầu như không bao giờ; đôi khi tôi sử dụng crontab -eđể thực hiện các thay đổi tạm thời, biết rằng tôi có thể khôi phục phiên bản hiện tại sau này.)


@maxclimber: Tôi không đồng ý. Để lưu crontab của bạn, sử dụng crontab -l > filename. Để khôi phục nó , crontab filename. Sử dụng giao diện do hệ thống cung cấp; không đi phía sau lưng và thao tác các tập tin hệ thống. Đối với một điều, việc cập nhật tệp sẽ không nhất thiết phải báo cho hệ thống đọc lại nó; các crontablệnh sẽ. Mặt khác, có thể có sự khác biệt giữa những gì trong tệp và đầu ra của crontab -l; trên Ubuntu, tệp có một số dòng bình luận bổ sung khuyên bạn không nên chỉnh sửa nó.
Keith Thompson

Tôi sẽ xóa bình luận khác của tôi. Nhận xét mới: Keith đề cập đến con đường /var/spool/cron/crontabs/<USER>. Trên SUSE, đường dẫn của tôi hơi khác một chút (lưu ý thêm dấu gạch chéo) : /var/spool/cron/cron/tabs/<USER>. Nghĩ rằng tôi sẽ đề cập đến nó cho những người mới chơi cron và linux như tôi. Câu trả lời của Keith là chính xác.
Mountainclimber

5

Kịch bản để phục hồi crontab đầy đủ

Tôi đã tạo một tập lệnh PHP thực hiện khôi phục hoàn toàn crontab của bạn, dựa trên nhật ký.

Nó xuất ra một thể hiện duy nhất của mỗi lệnh cron do người dùng chạy trong tuần trước.

Tôi đặt nó ở đây

https://github.com/dangreenisrael/recover_crontab

Đây là một đầu ra mẫu:

perl ~/sorttv/sorttv.pl

/usr/local/bin/flexget

bash ~/scripts/sort_sports.sh

~/scripts/play_recently_added.sh

1

Tôi xin lỗi, nhưng tôi không thể giúp hỏi điều hiển nhiên: tại sao không khôi phục nó từ bản sao lưu?

Er, xin lỗi, tôi thấy đó đã được đề xuất.


0

Nếu biến enorion EDITOR của bạn là EDITOR = vi, hãy thử

vi -r

để phục hồi phiên. Không trực tiếp viết phiên đã lưu, nếu bạn có một, vào thư mục crontab của bạn. Sử dụng nó như một hướng dẫn để tạo lại crontab của bạn bằng cách sử dụng

crontab -e

Lưu ý: Vì bạn không chỉ định HĐH, Solaris và các HĐH UNIX khác không nhận ra các thay đổi đối với các tệp crontab ngoại trừ các thay đổi được tạo thông qua crontab -e. Nếu tôi nhớ chính xác, Linux thì có.


Không có phiên để phục hồi; OP gõ crontabchứ không phải crontab -e. Xem câu trả lời của tôi tốt hơn (IMHO) để duy trì crontab của bạn.
Keith Thompson

0

Câu trả lời tuyệt vời từ @Keith Thompson - ý tưởng tốt được xây dựng lại từ / var / log / syslog!

Tôi cũng vô tình bị chặn crontab người dùng của mình nhưng đã có thể xây dựng lại nó với script-fu sau đây

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

nơi tên người dùng nên được thay thế bằng người dùng có crontab bạn muốn xây dựng lại.

Lưu ý rằng trước tiên bạn có thể cần phải nén nội dung của tệp /var/log/syslog.x.gz nếu nhật ký đã được nén (ubfox nén syslog.2 +)

Điều này cũng sẽ chỉ nhận được các lệnh vẫn còn trong nhật ký, sẽ diễn ra trong 7 ngày qua ... vì vậy nếu bạn có một nhiệm vụ hàng tháng không chạy ... thì một lệnh có thể đã biến mất

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.