【问题标题】:Parsing process start time from linux "ps" command output in c#从c#中的linux“ps”命令输出解析进程开始时间
【发布时间】:2015-03-18 15:54:51
【问题描述】:

如何解析 ps 命令的开始时间输出?它可以解析它是否在表单中,例如06:38PM,但是当它看起来像Tue01PM 时,它却无法解析。我还尝试添加cultureinfo,如Convert.ToDateTime(result[8], CultureInfo.GetCultureInfo("en-US")),以及ParseExact,如DateTime.ParseExact(result[8], "dddhhhh", CultureInfo.GetCultureInfo("en-US"))

【问题讨论】:

  • 真正的问题是:你是如何得到如此不同的表示的?第二个我从未见过,我一直在使用 Linux 系统。无论如何,您的错误是什么?没有它,没有人可以帮助你
  • Tue01PM 的假定输出是什么?对我来说,这听起来很不确定,因为取决于当前日期?
  • @ChristianBongiorno 问题是,我有不同语言(匈牙利语)的 Visual Studio,因此错误消息也是匈牙利语。我能以某种方式收到英文信息吗? (它说像字符串这样的东西不能被解释为有效的 DateTime 值)。这也是一个有点复杂的情况,因为它来自带有 ssh 的 ios。但我认为在这种情况下这无关紧要,我只是问,是否有办法将该字符串解析为 DateTime。
  • @Georg 06:38PM 也取决于当前日期,但它是可解析的。我认为预期的结果将是前一个星期二下午 1 点。可以这样解析字符串吗?
  • 我对匈牙利字母一无所知,但如果它们不是 ASCII,那么您将遇到问题。如果您尝试解析匈牙利 Linux 命令行的日期输出,我感觉您完全错了。

标签: c# linux parsing date datetime


【解决方案1】:

ps 命令可以被要求呈现特定的数据,在某些情况下以特定的格式呈现,这样可以更容易地解析结果。您使用-o 命令行选项请求特定数据,其参数是以逗号分隔的项目列表,格式为:item=HEADERHEADER 是要使用的列标题;忽略它意味着不会为该列打印任何标题(但如果您也忽略了=,您将获得一个默认标题)。

开始时间至少有两个常用项:startlstart。这些分别为您提供时间的标准版本和长版本:

$ ps -ostart= 2875
11:28:13
$ ps -olstart= 2875
Wed Mar 18 11:28:13 2015

在 Linux 上,ps 从“文件”/proc/<i>pid</i>/stat 获取其信息,该文件是包含空格分隔字段的单行(请参阅man 5 proc)。开始时间是列表中的第 22 项;它是一个整数,表示自系统启动以来的时钟滴答数。在 bash 中,您可以通过一些工作将其转换为更有用的东西:

start_time() {
  local now running ticks uptime
  now=$(date +%s)            # time in seconds since epoch
  running=$(cut -d' ' -f22 /proc/$1/stat)
                             # start time of process in ticks since boot
  ticks=$(getconf CLK_TCK)   # ticks per second (usually 100)
  uptime=($(</proc/uptime))  # seconds since boot and idle time
  bc <<<"$now-${uptime[0]}+$running/$ticks"
}

$ date +"%Y-%m-%d %H:%M:%S" -d@$(start_time 2875)
2015-03-18 11:28:12

【讨论】:

  • 收集 stat 文件的想法,但正如我所提到的,我在 iOs 上,我不知道如何在那里找到它(没有 proc 文件夹)。但是 -olstart 起作用了,我可以成功地从长格式中解析日期。
  • @Geiszla:很酷。我对 iOS 几乎一无所知(而且我没有在您的问题中看到任何地方提到它)。你给你的问题一个linux标签,这就是我提供linux答案的原因。
  • 是的,这也是我的回答 :) 只是没有例子
【解决方案2】:

在 linux 中,你可以override the system date format 给它任何你想要的东西。然后你可以确定输出。这就是我会做的。

【讨论】:

    【解决方案3】:

    在 epoc 中给出 pid / 进程 $MYPID 的开始时间

    MYPID=$PPID
    STARTING_EPOC_OF_MYPID=$(date +%s -d "$(ps -olstart= ${MYPID})")
    echo $STARTING_EPOC_OF_MYPID
    

    我不太确定,如果这与上面的不同。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-01-04
      • 2014-01-14
      • 2018-12-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-12-10
      相关资源
      最近更新 更多