Crontab người dùng được lưu trữ ở đâu?


249

Kể từ khi nâng cấp, crontab của người dùng của tôi đã bị xóa sổ. Đây không phải là lần đầu tiên điều này xảy ra trong năm nay và nó là một nỗi đau khi khôi phục nó mỗi lần.

Tôi muốn có thể sao lưu crontab cho người dùng của mình nhưng vì điều đó tôi cần biết nơi nó được lưu trữ.


4
thật tuyệt nếu ai đó cũng có thể đưa ra lý do TẠI SAO nó bị xóa sổ
Walter Tross

1
@WalterTross Vâng, nó khá phiền phức. Tôi đoán đó là tác dụng phụ của việc cập nhật crongói nhưng tôi đồng ý - đó không phải là điều nên xảy ra.
Oli

Uh, tôi không xóa cron của người dùng cho mỗi lần nâng cấp gói cron!
pl1nk

@ pl1nk Tôi không biết cái gì sẽ xóa sạch nó nhưng nó vẫn tiếp tục xảy ra. Con ma trong máy, tôi đoán thế.
Oli

Bảng người dùng được lưu trữ trên một khu vực tạm thời / var / spool / cron / crontabs / $ USER, do đó có thể bị xóa trong lần khởi động hoặc nâng cấp tiếp theo của bạn.
fcm

Câu trả lời:


325

Trên thực tế, không nên xử lý các tệp đó bằng tay. Mỗi crontabtrang nam:

Mỗi người dùng có thể có crontab của riêng họ và mặc dù
đây là các tệp trong đó /var/spool/cron/crontabs, nhưng họ không
có ý định chỉnh sửa trực tiếp.

Các tệp bên dưới /var/spoolđược coi là tạm thời / đang hoạt động, đó là lý do tại sao chúng có thể bị xóa trong quá trình nâng cấp, mặc dù xem xét kỹ hơn các crontập lệnh nâng cấp của gói có thể làm sáng tỏ điều này.

Dù sao, luôn luôn là một cách tốt để sao lưu các mục cron của bạn hoặc giữ chúng trong một tệp trong thư mục nhà của bạn.

Tôi giả sử bạn đang sử dụng crontab -eđể tạo tập tin crontab một cách nhanh chóng. Nếu vậy, bạn có thể lấy "bản sao" tệp crontab của mình bằng cách thực hiện crontab -l. Chuyển đến một tập tin để có được một "bản sao lưu":

crontab -l > my-crontab

Sau đó, bạn có thể chỉnh sửa tệp my-crontab để thêm hoặc sửa đổi các mục nhập, sau đó "cài đặt" nó bằng cách đưa nó cho crontab:

crontab my-crontab

Điều này không kiểm tra cú pháp tương tự như crontab -e.


7
crontab -ldễ dàng hơn là đi qua /var/spool/cron/crontabs/$USERhầu hết vì các quyền kỳ lạ trên tập tin đó.
Oli

1
Của iptables-savecron. Hay đấy ...
Parthian Shot

4
Có lẽ chúng ta nên đặt một crontab để tự động sao lưu> :)?
PascalVKooten

4
Chọc qua /var/spool/cron/crontabsrất tiện lợi khi bạn muốn quản lý hoặc kiểm tra crontabs từ nhiều người dùng.
dhasenan

1
Khi điều tra bí ẩn trên máy chủ bạn không quen thuộc với, người ta thường sudo grep -rHin "$string" /etc/cron*(trong đó chuỗi có thể là một lệnh như docker, lftp, iptables, vv Đó là một ý tưởng tốt để kiểm tra crontabs sử dụng cũng Đó là những gì đưa tôi đến với Q & A..sudo grep -rHin "$string" /etc/cron* /var/spool/cron*
Bruno Bronosky


30

Cuối cùng tôi đã tìm ra lý do tại sao cài đặt crontabs và Postfix của tôi tiếp tục bị hỏng sau khi khởi động. Đó là một lý do thực sự ngu ngốc nhưng ...

Tôi đã /var/spoolgắn kết như một tmpfsổ đĩa RAM.

Nghe có vẻ ngu ngốc, nhưng tôi đã làm theo một trong những tinh chỉnh SSD cũ để kéo dài tuổi thọ của SSD. Khi làm như vậy, tôi mù quáng gắn kết /tmp, /var/tmp/var/spoolnhư tmpfskhông nghĩ đến những hậu quả. Tôi nghĩ /var/spoollà như /proc/hay /run/và đó là chỉ hữu ích trong suốt thời gian của phiên giao dịch. Tôi đã sai rõ ràng.


8
Nó nên an toàn để gắn kết /tmpnhư tmpfs, nhưng không /var/tmphoặc /var/spool. /tmpđược sử dụng để lưu trữ tạm thời có thể bị mất khi khởi động lại. /var/tmpđược sử dụng để lưu trữ tạm thời sẽ còn lại sau khi khởi động lại. Và như bạn đã khám phá, /var/spoollà để dữ liệu được xử lý, dữ liệu này sẽ vẫn còn sau khi khởi động lại.
thomasrutter


2
Cũng lưu ý rằng số lần ghi không còn là vấn đề với SSD hiện đại.
thomasrutter

17

Để liệt kê tất cả các công việc định kỳ từ tất cả người dùng trong hệ thống của bạn:

for user in $(cut -f1 -d: /etc/passwd)
do
  echo $user
  crontab -u $user -l
done

Một giải pháp thay thế cho vấn đề của bạn sẽ là đặt chúng trong thư mục cron.d và chỉ định người dùng phù hợp cho mỗi cron như trong ví dụ:

00 01 * * * user /home/user/user-script.sh

nếu bạn đang khôi phục crontab từ một ổ đĩa khác, điều này sẽ không hoạt động vì crontab -uđang chạy từ hệ thống hiện tại của bạn.
JVE999

Mặc dù tôi cho rằng đó là một lớp lót trong đó có ít hơn 80 ký tự và có thể đọc được một chút, nhưng tôi thường thích đặt mã theo định dạng sao cho một người có thể sao chép-dán hoặc đặt nó vào tập lệnh (và, trong một tập lệnh, đây sẽ không phải là một dòng mã). Đề xuất chỉnh sửa ...
Parthian Shot

Ngoài ra, tôi đã định biến nó thành một while read uservòng lặp, để xử lý trường hợp tên người dùng chứa khoảng trắng, nhưng rõ ràng đó không phải là vấn đề. Bộ ký tự tên người dùng rất hạn chế.
Bắn Parthian
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.