Вопрос или проблема
На двух моих виртуальных машинах команда 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
не вызывает проблем.
Исправления и исследования
-
Проверка квот:
Ваша проблема может быть связана с настройками квот пользователя на файловой системе. Вы упомянули, что вывод команды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
, создание файла требует выделения определенного объема. -
Проверка состояния квот:
- Выполните команду
quota
для проверки текущего состояния квоты для пользователя, который вызывает командуcrontab
. Возможно, у вас достигнут лимит квоты. - Если квоты активированы и достигнут лимит, вы можете временно отключить их с помощью команды:
quotaoff -a
Это позволит проверить, решает ли это проблему с crontab.
- Выполните команду
-
Проверка доступности пространств:
После отключения квот попробуйте снова запуститьcrontab -e
. Если все работает, это подтверждает, что проблема связана с квотами. -
Восстановление квот:
После успешного редактирования файла crontab рекомендуется восстановить квоты с помощью:quotaon -a
и корректировать их, чтобы избежать подобных проблем в будущем.
Заключение
Разница между командами crontab
и mkdir
здесь заключается в том, что crontab требует создание и запись в файл, что может вызывать ошибки в условиях превышения квоты, в то время как mkdir
создает директорию, для которой квота не применяется. Ваша проблема решается отключением квот или увеличением лимитов. Рекомендуется следить за статусом квот на ваших системах, чтобы избежать подобных ошибок в будущем.