我正在尋找一種方法將cron信息轉換爲時間戳列表,使用R. 有沒有一種簡單的方法可以做到?將cron轉換爲R中的時間戳
鑑於crontab和開始日期和結束日期,我想獲得這兩個日期期間的觸發時間戳列表。
我還沒有找到任何專門處理CRON信息的包,但也許有人已經有這個問題?
感謝
我正在尋找一種方法將cron信息轉換爲時間戳列表,使用R. 有沒有一種簡單的方法可以做到?將cron轉換爲R中的時間戳
鑑於crontab和開始日期和結束日期,我想獲得這兩個日期期間的觸發時間戳列表。
我還沒有找到任何專門處理CRON信息的包,但也許有人已經有這個問題?
感謝
我想你指的是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"))
這是不完美的,因爲它不會幾個月或星期幾把手的名字,也不會處理特殊情況下每月的一天與星期幾,這需要治療*
不僅僅是一個簡單的範圍。
注意:命令執行的日期可以由兩個字段指定 - 日期和星期幾。如果兩個字段都受限制(即不是
*
),則當任一字段與當前時間匹配時,將運行該命令。例如,30 4 1,15 * 5
會導致命令在每個月的1號和15號以及每個星期五的凌晨4點30分運行。
生成的數據幀可以變成時間戳列表,但我沒有爲此編寫代碼。也許別人會依靠這篇文章。簡單但慢速的方法將逐分鐘遍歷可能的時間戳,每個時間戳都會查看計算的數據框中的某一行是否與該值匹配。更快的解決方案將逐日進行迭代,使用該解決方案來計算每週的星期幾和星期幾,然後從與該天匹配的所有行中獲取時間。
您能提供一個輸入和期望輸出的例子嗎? – January
@January考慮到crontab以及開始日期和結束日期,我希望獲取這兩個日期期間的觸發時間戳列表。 – RockScience
'* * * * * date >>〜/ timestamps.txt'。然後等待。哈哈。 – flodel