【问题标题】:Calling "top" command from systemd service从 systemd 服务调用“top”命令
【发布时间】:2016-10-25 23:22:31
【问题描述】:

我编写了一个 bash 脚本,它将特定进程的日期、时间、CPU 和 MEM 使用情况输出到一个文件中。我创建了一个“topLogger.service”服务,它运行并将日期和时间输出到文件中,但顶部输出(CPU 和 MEM)没有显示在输出文件中。

当我从 bash shell 运行 bash 脚本时,它工作得很好!

sudo ./topLoggerScript.sh 

我相信这条线可能是罪魁祸首,但我不知道如何解决这个问题。

/usr/bin/top -n 1 | grep service_to_monitor

这是整个脚本:

#!/bin/bash

cpu=10
mem=11
cur_date=$(date +"%Y-%m-%d")
echo "starting date is $cur_date"

# Create starting file if todays file does not exist
if [ ! -e  /file/location/$cur_date.txt ] ; then
  echo "DATE  TIME  CPU  MEM" > /file/location/$cur_date.txt
fi

    while true
               do
                  STRING=$(/usr/bin/top -n 1 | grep service_to_monitor)
                  arr=($STRING)

                  next_date=$(date +"%Y-%m-%d")

                  if [ "$cur_date" != "$next_date" ];then
                     # Day changed. Create a new file using cur_date.
                     echo "DAY CHANGE"
                     echo "DATE TIME CPU MEM" > /file/location/$cur_date.txt

                     # And change prev_date to cur_date
                     cur_date=$next_date
                  fi

                  sudo echo $(date +"%Y-%m-%d  %H-%M-%S")  ${arr[cpu-1]}  ${arr[mem-1]}>>/file/location/$cur_date.txt
                  sleep 5
    done

这是我的服务文件的权限:

-rw-rw-r--  1 root root  121 Oct 25 15:54 topLogger.service

这里是 topLogger.service 文件本身:

    [Unit]
    Description=Resource monitor for a specific process

    [Service]
    ExecStart=/path/to/script/logResourceUsage.sh

【问题讨论】:

    标签: linux bash unix service systemd


    【解决方案1】:

    问题是 top -n 1 在打印其输出后不会退出,就像 echo 那样。您编写脚本的方式需要一个进程将这些值打印为纯文本,然后退出,然后将其通过管道传输到greptop -l 1 -n 1 可能更理想,这将适当地打印和退出。

    【讨论】:

    • 那是mac版的top,在debian中例如top -n 1 一次迭代后退出。
    • 感谢您的 cmets,重申一下,此脚本在 bash 中运行时完全有效。当作为服务运行时,它还会将日期/时间输出到指定的文件。问题是 MEM 和 TOP 数据在作为服务运行时不会输出到文件,而不是在 bash 中运行。
    【解决方案2】:

    我遇到了类似的问题。顶部输出根据 COLUMNS 环境变量而变化。使用 systemd 或 nohup 运行时,输出会发生变化,因此会破坏您的代码。

    为了解决这个问题,您可以使用 -w 选项将列数传递给顶部命令。

    /usr/bin/top -n 1 -w 1000 | grep service_to_monitor
    

    这样你的顶级命令将独立于它运行的环境。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-03-12
      • 2017-03-22
      • 2018-02-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-03-16
      • 1970-01-01
      相关资源
      最近更新 更多