我通过 crontab -e 添加了一个 cronjob,每分钟执行一次。我在 systemctl 上启用并启动了 cronie。
设置编辑器
$ export EDITOR=vim
添加cron任务
$ crontab -e
* * * * * Rscript /srv/shiny-system/cron/CPU.R
~
~
"/tmp/crontab.8VZ7vq" 1 line, 47 characters
安装克罗尼
$ sudo pacman -Syu cronie
$ sudo systemctl enable --now cronie.service
$ systemctl status cronie
列出 cron 任务
$ crontab -l
* * * * * Rscript /srv/shiny-system/cron/CPU.R
我在下面用 R 编写了这个程序,当我在 shell 中启动它时,它工作正常,但是当我用 cronie 启动它时,它只是不执行它应该执行的操作。
setwd("/srv/shiny-system/cron")
I <- 0
for (i in 1:60) {
system("top -n 1 -b -u shiny > top.log")
dat <- readLines("top.log")
id <- grep("R$", dat)
Names <- strsplit(gsub("^ +|%|\\+", "", dat[7]), " +")[[1]]
if (length(id) > 0) {
# ‘top’ data frame;
L <- strsplit(gsub("^ *", "", dat[id]), " +")
dat <- data.frame(matrix(unlist(L), ncol = 12, byrow = T))
names(dat) <- Names
dat <- data.frame(Time = Sys.time(), dat[, -ncol(dat)], usr = NA, app = NA)
dat$CPU <-as.numeric(as.character(dat$CPU))
dat$MEM <-as.numeric(as.character(dat$MEM))
# Check if connection number changed;
for (i in 1:length(dat$PID)) {
PID <- dat$PID[i]
system(paste("sudo -i netstat -p | grep ", PID, " > netstat.log"))
# system(paste("sudo -i netstat -p | grep ", PID, " >> netstat.log2"))
system(paste("sudo -i lsof -p ", PID, " | grep DIR > lsof.log"))
netstat <- readLines("netstat.log")
lsof <- readLines("lsof.log")
dat$usr[i] <- length(grep("ESTABLISHED", netstat) & grep("tcp", netstat))
dat$app[i] <- regmatches(lsof, regexec("srv/shiny-server/(.*)", lsof))[[1]][2]
}
dat <- dat[, c("app", "usr")]
} else {
dat <- data.frame(app = "app1", usr = 0)
}
write.table(dat, file = "CPU.txt")
}
该程序生成以下 4 个文件和 cronie似乎要运行 bcos,我可以在这个位置 /srv/shiny-system/cron 中看到它们,
top.log
netstat.log
lsof.log
CPU.txt
netstat.log
但问题是和中没有日志/数据/信息lsof.log
那么这到底是我的 R 程序还是 cronie 的问题呢?
但是当我用 cron 运行这个程序时乌班图Linuxnetstat.log
,我在和中得到了我想要的数据lsof.log
。
那么这是 Arch Linux 中的一个错误/问题吗?看来 Arch 在netstat
和 方面有问题lsof
。我netstat
也安装了,
为 netstat 安装网络工具
$ sudo pacman -S net-tools
有任何想法吗?