Есть ли способ запустить задачу cron, основываясь на существовании файла, а не на c времени? - PullRequest
0 голосов
/ 22 апреля 2020

Я пытаюсь использовать cron r или планировщик задач в R для ежедневного запуска сценария на основе файла .CSV, который обновляется каждый день. Во-первых, нет определенного c времени дня, когда файл CSV обновляется (скажем, 4/20 он был обновлен в 15:00, но в 4/21 он обновлялся в 14:30, а в 4:22 получил обновление в 12 вечера). Основным триггером является не время суток, а ежедневное существование файла. Есть ли способ, которым я могу запустить это с помощью любого из дополнений R? Я использую сервер на работе, поэтому я не использую планировщик задач windows, так как R не на моей машине.

Ответы [ 2 ]

0 голосов
/ 22 апреля 2020

Cron - строго планировщик времени.

Сказав это, есть обходной путь.

  1. Создайте скрипт (например, mycron.py) следующим образом
import os.path

if os.path.isfile("/tmp/myfile.csv"):
  # File exists
  # Do something
else:
  # File does not exist
  pass
Запланируйте выполнение этого скрипта (mycron.py) с регулярными интервалами

Python Сценарий является лишь примером. Не стесняйтесь использовать свой любимый язык сценариев

0 голосов
/ 22 апреля 2020

Вместо того, чтобы запускать задание cron каждый день, запускайте его каждые 5 минут (или с некоторым разумным интервалом) и следите за тем, когда он обрабатывал файл. Например,

needswork <- function(filename, expr, updated = paste0(filename, ".seen")) {
  if (!file.exists(filename)) return(FALSE)
  if (!file.exists(updated)) return(TRUE)
  return(file.info(updated)$mtime < file.info(filename)$mtime)
}
donework <- function(filename, expr, updated = paste0(filename, ".seen")) {
  writeLines(character(0), updated)
}

if (needswork("/path/to/mainfile.csv")) {
  # process the file here
  # ...
  # update
  donework("/path/to/mainfile.csv")
}

Я мог бы немного расширить needswork, чтобы добавить проблемы с уведомлениями, такие как

needswork <- function(filename, expr, updated = paste0(filename, ".seen")) {
  if (!file.exists(filename)) return(FALSE)
  if (difftime(Sys.time(), file.info(filename)$mtime, units="secs") > 60*60*24) {
    some_notify_function()
    # perhaps something like
    msg <- paste("The file", sQuote(filename), "has not been updated since",
                 file.info(filename$mtime))
    RPushbullet::pbPost("note", title = "No recent updates", body = msg)
  }
  if (!file.exists(updated)) return(TRUE)
  return(file.info(updated)$mtime < file.info(filename)$mtime)
}
...