Я думаю самый легкий способ сделать, это было бы, чтобы Ваша программа проверила на существование файла прежде, чем предпринять попытку и создать тот файл, после того как это выполняется успешно.
Если Вы не можете изменить программу, чтобы сделать так, используйте сам cronjob. Что-то вроде:
test -e /path/to/tempfile || ( /path/to/program && touch -a /path/to/tempfile )
Из-за пути Unix оценивает проверки условия, когда-то левая сторона ||
условие оценивает к true
, все выражение верно, и правая сторона никогда не оценивается - IE, программу не называют.
Затем в parens, && требует, чтобы обе стороны оценили к истинному, итак, если /path/to/program
выходы с ненулевым кодом возврата, нет никакого смысла в оценке оператора справа - выражение уже оценивает ко лжи - и /path/to/tempfile
никогда не создается.
Существует компонент в ядре (названный виртуальной файловой системой или VFS, если коротко), который предоставляет универсальный интерфейс всем файловым системам. Это понимает вещи как типы файлов (регулярные файлы, каталоги, символьные ссылки, …), метаданные (времена, полномочия, …) и содержание файла.
Каждый процесс Linux живет в пространстве имен, которое указывает, где файловые системы смонтированы. Часто все процессы живут в том же пространстве имен; пространства имен главным образом предназначаются для поддержки виртуализации. Пространство имен является по существу набором путей с внутренней ссылкой файловой системы, связанной с каждым путем. Монтирование и размонтирование состоят из изменения того пространства имен.
Когда процесс получает доступ к файлу, компонент VFS анализирует путь на основе пространства имен процесса и текущего каталога и определяет, под которой точкой монтирования расположен файл. VFS затем отправляет связанную с файлом команду соответствующему драйверу файловой системы на основе внутренней ссылки файловой системы, связанной с точкой монтирования.
Это - задание драйвера файловой системы для перевода команды в хранение данных или извлечения. Каждый тип файловой системы. Большинство драйверов файловой системы не взаимодействует непосредственно с аппаратными средствами, но только с другими драйверами. Драйвер для поддержанной диском файловой системы (ext4, btrfs, vfat, …) переводит команду в операции блочной системы хранения (чтение и секторы записи от раздела или другого блочного устройства). Драйвер для поддержанной сетью файловой системы (nfs, cifs, …) переводит команду в коммуникацию по сетевому каналу. Драйвер для внутренней файловой системы ядра (proc, sysfs, …) работает самостоятельно. Драйвер файловой системы FUSE передает команду на процесс пространства пользователя.
Для каждой файловой системы существует драйвер, записанный с API, который может вызвать VFS Linux, когда это сталкивается с объектом, хранившим в файловой системе того типа. Это позволяет прозрачность через всю иерархию каталогов относительно файла Linux - и ориентированные на файловую систему системные вызовы (так же как возможный, например, никакие полномочия на VFAT, поэтому chown(2)
перестанет работать).
Каждый тип FileSystem является драйвером в ядре. Драйвер FileSystem называет дисковый драйвер для доступа к блочному устройству.