Где хранится пользовательский crontab?

249

После обновления crontab моего пользователя был уничтожен. Это не первый раз, когда это происходит в этом году, и это боль, восстанавливающая это каждый раз.

Я хотел бы иметь возможность сделать резервную копию crontab для моего пользователя, но для этого мне нужно знать, где он хранится.

Оли
источник
4
было бы неплохо, если бы кто-то мог также дать причину, ПОЧЕМУ он уничтожен
Уолтер Тросс
1
@WalterTross Да, это довольно раздражает. Я предполагаю, что это побочный эффект обновления cronпакета, но я согласен - это не то, что должно произойти.
Оли
Э-э, я не хочу, чтобы пользователь cron обновлялся за обновление пакета cron!
pl1nk
@ pl1nk Я понятия не имею, что уничтожает это, но это продолжает происходить. Призрак в машине, наверное.
Оли
Пользовательские таблицы хранятся во временной области / var / spool / cron / crontabs / $ USER, поэтому могут быть удалены при следующей загрузке или обновлении.
fcm

Ответы:

325

На самом деле, не рекомендуется обрабатывать эти файлы вручную. На crontabстраницу man:

Каждый пользователь может иметь свой собственный crontab, и, хотя
это файлы в нем /var/spool/cron/crontabs, они не
предназначены для непосредственного редактирования.

Файлы ниже /var/spoolсчитаются временными / рабочими, поэтому они, вероятно, удаляются во время обновления, хотя более внимательный взгляд на cronсценарии обновления пакета может пролить некоторый свет на это.

В любом случае, всегда рекомендуется создавать резервные копии записей cron или сохранять их в файле в вашем домашнем каталоге.

Я предполагаю, что вы используете crontab -eдля создания файлов crontab на лету. Если это так, вы можете получить «копию» вашего файла crontab, выполнив crontab -l. Передайте это в файл, чтобы получить «резервную копию»:

crontab -l > my-crontab

Затем вы можете отредактировать этот файл my-crontab, чтобы добавить или изменить записи, а затем «установить» его, передав его в crontab:

crontab my-crontab

Это делает ту же проверку синтаксиса, что и crontab -e.

roadmr
источник
7
crontab -lэто проще, чем проходить в /var/spool/cron/crontabs/$USERосновном из-за странных прав доступа к этому файлу.
Оли
1
iptables-saveКрон. Хороший ...
Парфянский выстрел
4
Возможно, нам следует установить crontab для автоматического резервного копирования> :)?
PascalVKooten
4
Пролистать /var/spool/cron/crontabsудобно, если вы хотите курировать или исследовать crontabs от нескольких пользователей.
дхасенан
1
При расследовании тайны на сервере вы не знакомы, он является общим для sudo grep -rHin "$string" /etc/cron*(где строка может быть команда , как docker, lftp, iptablesи т.д. Это хорошая идея , чтобы проверить crontabs пользователей также Это то, что привело меня к этому Q & A..sudo grep -rHin "$string" /etc/cron* /var/spool/cron*
Бруно Броноски
50

Он хранится в /var/spool/cron/crontabsпапке под именем пользователя.

Манула Вайдьянатха
источник
30

Я наконец-то узнал, почему мои установки crontabs и Postfix продолжали ломаться после загрузки. Это действительно глупая причина, но ...

Я /var/spoolсмонтировал как tmpfsRAM-диск.

Звучит идиотски, и это так, но я следовал одному из старых SSD-твиков, чтобы продлить жизнь моего SSD. При этом, я слепо смонтированный /tmp, /var/tmpи , /var/spoolкак tmpfsне думая о последствиях. Я думал, что это /var/spoolпохоже /proc/или /run/и что это было полезно только на время сеанса. Я был явно неправ.

Оли
источник
8
Должно быть безопасно смонтировать /tmpкак tmpfs, но не как /var/tmpили /var/spool. /tmpиспользуется для временного хранения, которое может быть потеряно при перезагрузке. /var/tmpиспользуется для временного хранения, которое останется после перезагрузки. И, как вы обнаружили, /var/spoolдля обработки данных, которые также останутся после перезагрузки.
Томасруттер
2
Также обратите внимание, что количество записей больше не является проблемой современных SSD.
Томасруттер
17

Чтобы вывести список всех заданий cron от всех пользователей вашей системы:

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

Альтернативой вашей проблеме может быть размещение их в папке cron.d и указание соответствующего пользователя для cron, как в примере:

00 01 * * * user /home/user/user-script.sh
pl1nk
источник
если вы восстанавливаете crontab с другого диска, это не будет работать, потому что crontab -uон работает с вашей текущей системы.
JVE999
Хотя я полагаю, что это однострочный текст, вмещающий менее 80 символов и несколько читабельный, я обычно предпочитаю размещать код в таком формате, чтобы человек мог либо скопировать, либо вставить его в сценарий (и, в сценарии это не будет одной строкой кода). Предлагая редактировать ...
Парфянский выстрел
Кроме того, я собирался превратить его в while read userцикл, чтобы обработать случай, когда имя пользователя содержит пробелы, но, очевидно, это не проблема. Очень ограниченный набор символов имени пользователя.
Парфянский выстрел