Команда crontab не может создать временный каталог.

Вопрос или проблема

На двух моих виртуальных машинах команда crontab -e не может создать каталог в /tmp, но команда mkdir работает:

/tmp/crontab.oxyaBy: Ошибка ввода/вывода
Создание временного файла crontab не удалось - прерывание

Вывод strace:

root@vm:~# strace crontab -e
mkdir("/tmp/crontab.1SuJe9", 0700)      = -1 EIO (Ошибка ввода/вывода)

root@vm:~# strace mkdir /tmp/crontab.1SuJe9 -m 700
mkdir("/tmp/crontab.1SuJe9", 0700)      = 0

Обе виртуальные машины работают на Ubuntu 16.04.6 LTS (4.4.0-173-generic x86_64)

Это воспроизводится каждый раз, и проблема сохраняется после перезагрузок, fsck говорит, что все в порядке, и на этих ВМ нет других проблем. Я уже пытался переустановить пакет cron, но ничего не изменилось.

Есть идеи? Спасибо!

Редактировать: dmesg показывает

EXT4-fs (dm-0): Запись квоты (off=4080, len=40) отменена, так как не выровнена по блоку
Ошибка квоты (устройство dm-0): v1_commit_dqblk: запись dquota не удалась

Команда crontab работает с quotaoff, но мне все равно хотелось бы знать, почему crontab и mkdir ведут себя по-разному…

Это проблема файловой системы. Создание каталога отличается от создания файла.

Проверьте настройки квоты для вызывающего пользователя.

Кроме того, убедитесь, что вы можете создавать файлы там от имени того же пользователя, используя echo или cat и так далее, И вы можете что-то записать в файл, затем проследите за проблемой с этого момента.

Обновление: очевидно, это проблема, связанная с квотой, так как вы обновили свой вопрос. Фактически, с точки зрения квоты каталоги занимают ноль байт, поэтому вы можете создавать столько каталогов, сколько захотите, даже когда квота достигнута. Но для работы cron должен быть создан файл ненулевого размера, что определенно заблокировано, если максимальная квота достигнута.

У меня была точно такая же проблема из-за того, что для пользователя root была включена квота, поэтому я сначала отключил квоты вообще, используя quotaoff -a, а затем повторил команду без проблем. Позже я исправил квоты, теперь у меня больше нет проблем…

Ответ или решение

Проблемы с командой crontab, которая не может создать временную директорию, в отличие от команд для создания каталогов, таких как mkdir, могут возникать по различным причинам. В вашем случае речь идет о ситуации, когда команда crontab -e не может создать временную директорию в /tmp, выдавая ошибку ввода-вывода (Input/output error), в то время как mkdir выполняется без проблем.

Анализ проблемы

Сообщение об ошибке:

/tmp/crontab.oxyaBy: Input/output error
Creation of temporary crontab file failed - aborting

указывает на то, что при создании временного файла crontab возникает ошибка, тогда как команда mkdir /tmp/crontab.1SuJe9 успешно выполняется.

Вывод strace

Вывод strace для команды crontab -e:

mkdir("/tmp/crontab.1SuJe9", 0700)      = -1 EIO (Input/output error)

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

Исправления и исследования

  1. Проверка квот:
    Ваша проблема может быть связана с настройками квот пользователя на файловой системе. Вы упомянули, что вывод команды dmesg показывает следующее:

    EXT4-fs (dm-0): Quota write (off=4080, len=40) cancelled because not block aligned
    Quota error (device dm-0): v1_commit_dqblk: dquota write failed

    Это указывает на проблему с записью квоты. crontab создает временные файлы и, таким образом, использует пространство, которое может быть ограничено квотой. В отличие от mkdir, создание файла требует выделения определенного объема.

  2. Проверка состояния квот:

    • Выполните команду quota для проверки текущего состояния квоты для пользователя, который вызывает команду crontab. Возможно, у вас достигнут лимит квоты.
    • Если квоты активированы и достигнут лимит, вы можете временно отключить их с помощью команды:
      quotaoff -a

      Это позволит проверить, решает ли это проблему с crontab.

  3. Проверка доступности пространств:
    После отключения квот попробуйте снова запустить crontab -e. Если все работает, это подтверждает, что проблема связана с квотами.

  4. Восстановление квот:
    После успешного редактирования файла crontab рекомендуется восстановить квоты с помощью:

    quotaon -a

    и корректировать их, чтобы избежать подобных проблем в будущем.

Заключение

Разница между командами crontab и mkdir здесь заключается в том, что crontab требует создание и запись в файл, что может вызывать ошибки в условиях превышения квоты, в то время как mkdir создает директорию, для которой квота не применяется. Ваша проблема решается отключением квот или увеличением лимитов. Рекомендуется следить за статусом квот на ваших системах, чтобы избежать подобных ошибок в будущем.

Оцените материал
Добавить комментарий

Капча загружается...