Де зберігається користувацький crontab?


249

З моменту оновлення crontab мого користувача було вимкнено. Це вже не перший раз, коли це сталося цього року, і це біль кожного разу відновлює.

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


4
Було б добре, якби хтось також міг дати причину ЧОМУ його викреслили
— Уолтер Трос

1
@WalterTross Так, це дуже дратує. Я б припустив, що це побічний ефект від оновлення cronпакета, але я згоден - це не те, що має відбутися.
— Олі

Ага, я не хочу, щоб цей користувацький крон витирався за оновлення пакета cron!
— pl1nk

@ pl1nk Я поняття не маю, що це витерти, але це все одно відбувається. Привид у машині, я думаю.
— Олі

Таблиці користувачів зберігаються у тимчасовій області / var / spool / cron / crontabs / $ USER, оскільки такі можуть бути видалені під час наступного завантаження або оновлення.
— fcm

Відповіді:


325

Насправді, не рекомендується обробляти ці файли вручну. На crontabсторінку чоловіка:

Кожен користувач може мати власний 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.


7
crontab -lпростіше, ніж переживати /var/spool/cron/crontabs/$USERздебільшого через химерні дозволи на цей файл.
— Олі

1
iptables-saveКрон. Приємно ...
— Парфянський розстріл

4
Можливо, нам слід поставити crontab, щоб автоматично створити резервну копію> :)?
— PascalVKooten

4
Пробірка /var/spool/cron/crontabsзручна, коли ви хочете вилікувати чи вивчити кронти від декількох користувачів.
— dhasenan

1
При розслідуванні таємниці на сервері ви не знайомі, він є загальним для sudo grep -rHin "$string" /etc/cron*(де рядок може бути команда , як docker, lftp, iptablesі т.д. Це гарна ідея , щоб перевірити crontabs користувачів також Це те, що привело мене до цього Q & A ..sudo grep -rHin "$string" /etc/cron* /var/spool/cron*
— Бруно Броноський


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це обробка даних, які також залишаться після перезавантаження.
— thomasrutter


2
Зауважте також, що кількість сучасних SSD-дисків вже не є проблемою.
— thomasrutter

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

якщо ви відновляєте crontab з іншого диска, це не працюватиме, оскільки crontab -uпрацює від вашої поточної системи.
— JVE999

Хоча я вважаю, що це однолінійний вміст, який вміщує менше 80 символів і дещо читабельний, я, як правило, люблю вводити код у такому форматі, щоб людина могла або скопіювати, вставити або вкласти його в сценарій (і, у сценарії це не буде один рядок коду). Пропоную редагувати ...
— Парфянський розстріл

Також я збирався перетворити його на while read userцикл, щоб обробити випадок, коли ім'я користувача містить пробіли, але, мабуть, це не проблема. Дуже обмежений набір символів імені користувача.
— Парфянський розстріл
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.