Блестящий серверный монитор - PullRequest
0 голосов
/ 12 декабря 2018

У меня есть очень простое приложение Shiny, показывающее загрузку процессора и доступную память блестящего сервера:

ui <- fluidPage(
  titlePanel('Shiny Server Monitor'),
  DT::dataTableOutput("cpu")
)

server <- function(input, output, session) {


  output$cpu <- DT::renderDataTable({
     invalidateLater(1000)

    system("free -h > top.log")
    system("uptime > uptime.log")

    free <- readLines("top.log")
    uptime <- readLines("uptime.log")

    mem = strsplit(free, " ")
    available_mem =tail(mem[[2]],n=1)

    # I have 6 cores so normalized by deviding the load avarage to 6.
    load_ave = round(as.numeric(unlist(strsplit(unlist(strsplit(uptime, ","))[4],":"))[2])/6*100,2)

    dat = data.frame(load_ave,available_mem)
    colnames(dat) = c("CPU usage [%]", "Available memory [Gb]")


    DT::datatable(dat,rownames= FALSE)

  }) 

}

Поскольку я использую команду invalidateLater, выходная таблица обновляется каждую секунду ипоэтому мигает, что делает все очень уродливым.

Есть ли способ исправить эту проблему или представить результат (особенно использование ЦП) в виде команды htop в Linux, например: enter image description here

1 Ответ

0 голосов
/ 12 декабря 2018

Попробуйте добавить

tags$style(type="text/css", ".recalculating {opacity: 1.0;}")

к вашему fluidPage.

Редактировать:

Извините, вышеприведенное работает для plotOutput.Что касается вашего datatable, вам нужно будет сделать его таблицей на стороне клиента (добавлено server = FALSE в renderDataTable):

library(shiny)

ui <- fluidPage(
  titlePanel('Shiny Server Monitor'),
  DT::dataTableOutput("cpu")
)

server <- function(input, output, session) {



      output$cpu <- DT::renderDataTable({
        invalidateLater(1000)

        system("free -h > top.log")
        system("uptime > uptime.log")

        free <- readLines("top.log")
        uptime <- readLines("uptime.log")

        mem = strsplit(free, " ")
        available_mem =tail(mem[[2]], n=1)

        # I have 6 cores so normalized by deviding the load avarage to 6.
        load_ave = round(as.numeric(unlist(strsplit(unlist(strsplit(uptime, ","))[4],":"))[2])/6*100,2)

        dat = data.frame(Sys.time(), load_ave, available_mem)
        colnames(dat) = c("CPU usage [%]", "Available memory [Gb]")


        DT::datatable(dat, rownames= FALSE)

      }, server = FALSE) 

    }

    shinyApp(ui = ui, server = server)
...