3

Rを使用して、cron情報をタイムスタンプのリストに変換する方法を探しています。簡単な方法はありますか?

crontabと開始日と終了日を前提として、これら2つの日付の間のトリガータイムスタンプのリストを取得したいと思います。

特にCRON情報を扱うパッケージは見つかりませんでしたが、誰かがすでにこの問題を抱えている可能性がありますか?

ありがとう

4

1 に答える 1

3

crontab(5)形式を意味していると思います。この情報を解析するライブラリがないことは知っていますが、次のスニペットで開始できます。

splitre <- function(p, s) {
  s <- as.character(s)
  stopifnot(length(s) == 1)
  m <- gregexpr(p, s)[[1]]
  if (m[1] == -1) return(s);
  return(substring(s, c(1, m + attr(m, "match.length")), c(m - 1, nchar(s))))
}

ranges <- function(desc, lo, hi, name) {
  res <- integer(0)
  for (range in splitre(",", desc)) {
    m <- regexec("^(?:\\*|(?:(\\d+)(?:-(\\d+))?))(?:/(\\d+))?$", range)
    m <- regmatches(range, m)[[1]]
    m[m == ""] <- NA
    m[1] <- NA
    m <- as.integer(m)
    if (is.na(m[2])) r <- lo:hi
    else if (is.na(m[3])) r <- m[2]
    else r <- m[2]:m[3]
    if (!is.na(m[4])) {
      stopifnot(m[4] > 0)
      r <- r[rep(c(TRUE, rep(FALSE, m[4] - 1)), length.out = length(r))]
    }
    res <- c(res, r)
  }
  res <- data.frame(res)
  names(res) <- name
  return(res)
}

ct2df <- function(lines) {
  res <- data.frame()
  for (line in lines) {
    if (regexpr("^ *(#|$)", line) == 1) continue
    parts <- splitre(" +", line)
    stopifnot(length(parts) > 5)
    j <- ranges(parts[1], 0, 59, "minute")
    j <- merge(j, ranges(parts[2], 0, 23, "hour"))
    j <- merge(j, ranges(parts[3], 1, 31, "day.of.month"))
    j <- merge(j, ranges(parts[4], 1, 12, "month"))
    j <- merge(j, ranges(parts[5], 0, 6, "day.of.week"))
    res <- rbind(res, j)
  }
  return(res)
}

print(ct2df("* 1-2,5 1-10/2 */3 1 command"))

これは、月または曜日の名前を処理しないため、完全ではありません*。また、単純な範囲以上の処理を必要とする日と曜日の特殊なケースを処理しません。

注:コマンドの実行日は、曜日と曜日の2つのフィールドで指定できます。両方のフィールドが制限されている場合(つまり、制限されていない場合*)、どちらかのフィールドが現在の時刻と一致したときにコマンドが実行されます。たとえば、30 4 1,15 * 5毎月1日と15日の午前4時30分にコマンドを実行し、さらに毎週金曜日にコマンドを実行します。

結果のデータフレームはタイムスタンプのリストに変換できますが、そのためのコードは作成していません。おそらく他の誰かがこの投稿に基づいて構築するでしょう。単純ですが遅い方法では、可能なタイムスタンプを1分ごとに繰り返し、タイムスタンプごとに、計算されたデータフレームの行がその値と一致するかどうかを確認します。より高速なソリューションは、日ごとに反復し、それを使用して曜日と曜日を計算し、その日に一致するすべての行から時間を取得します。

于 2012-10-12T11:24:44.707 に答える