【问题标题】:It is possible to sort the proccesses by a given date in bash?可以在 bash 中按给定日期对进程进行排序吗?
【发布时间】:2020-05-19 14:21:52
【问题描述】:

我要做的只是按输入日期对流程进行排序。 这就是我保存日期的方式:

#!/bin/bash
echo "Insert the date yyyy-mm-dd"
read a
if ! [[ $date =~ ^[0-9]{4}-[0-9]{2}-[0-9]{2}$ ]]
then echo "Date is not valid"
elif b=`date --date=$a '+%Y-%m-%d'`
then 
????
fi

如何显示当前的流程?谢谢。

【问题讨论】:

  • AFAIK,除非您的操作系统定期将进程列表保存在某处,否则没有命令可以替换 ???
  • ba 在您的代码中可能不会相同吗?你到底想排序什么?我在您的代码中没有看到任何尝试排序。
  • @oguzismail 我不认为它这样做..
  • 那么您正在寻找甚至不存在的东西。你可以编写一个程序,定期将进程列表保存到一个文件中,然后你可以用它的日志做任何你想做的事情
  • @jordanm 你是对的。既然你提到它,我不知道我究竟为什么这样做。您看不到任何尝试的排序,因为我没有尝试专门对它们进行排序,而是在它们从该日期开始时显示它们。我觉得我无法说清楚,因为我不太了解这项任务。我四处询问,但无济于事。这里是任务:一个 shell 脚本,显示在特定日期在后台启动的进程。日期是一个位置参数。感谢您的宝贵时间。

标签: bash date terminal jobs ps


【解决方案1】:

你可以指定一个格式化程序并使用lstart,就像这个命令:

ps -eo lstart,pid,cmd

上面的命令将输出所有进程,使用格式化程序来获取日期+时间、PID 启动和命令运行,但我已更改日期格式以与您的日期输入保持一致

这就是你要找的:

#!/bin/bash
declare -A MONTHS
#months Dictionary

MONTHS[01]=Jan
MONTHS[02]=Feb
MONTHS[03]=Mar
MONTHS[04]=Apr
MONTHS[05]=May
MONTHS[06]=Jun
MONTHS[07]=Jul
MONTHS[08]=Aug
MONTHS[09]=Sep
MONTHS[10]=Oct
MONTHS[11]=Nov
MONTHS[12]=Dec

echo "Insert the date yyyy-mm-dd"
IFS="-" read -a val

if [[ "${val[0]}-${val[1]}-${val[2]}" =~ ^[0-9]{4}-[0-9]{2}-[0-9]{2}$ ]]
then
    echo "Date is valid!!"
    ps -eo lstart,pid,cmd --sort=start_time | \
    awk {'print $5 "-" $2 "-" $3 " " $6 " " $7'} | \
    grep "${val[0]}-${MONTHS[${val[1]}]}-${val[2]}"

else
    echo "Date is not valid"
fi

输出样本:

2020-May-19 23 [crypto]
2020-May-19 230 [scsi_tmf_27]
2020-May-19 231 [scsi_eh_28]
2020-May-19 232 [scsi_tmf_28]
2020-May-19 233 [scsi_eh_29]
2020-May-19 234 [scsi_tmf_29]
2020-May-19 235 [scsi_eh_30]
2020-May-19 236 [scsi_tmf_30]
2020-May-19 237 [scsi_eh_31]
2020-May-19 238 [scsi_tmf_31]
2020-May-19 239 [scsi_eh_32]
2020-May-19 2390 /usr/lib/deja-dup/deja-dup-monitor

【讨论】:

  • 我的上帝!这个练习让我很头疼..我非常感谢你!我真的很感谢你的帮助。但是,我不明白你在那里所做的一切——这里的菜鸟,记得吗?:)。那么你能解释一下 awk 命令中的所有数字是怎么回事吗?另外,如果它们前面有 $ 符号,这是否意味着它们是位置参数?
  • 是的,所以如果你运行这个命令ps -eo lstart,pid,cmd,你会看到每一行的输出格式如下Tue May 19 15:41:12 2020 8339 [jfsIO],我只是用awk将它们映射为2020-May-19 8339 [jfsIO]跨度>
  • 注意:您可以使用 `` 将 shell 命令拆分为多行
  • @MahmoudOdeh 既然您已经调用了read,不妨将输入拆分为基于- 作为字段分隔符的数组,如:IFS="-" read -a val。现在可以使用${val[0]}, ${val[1]}, ${val[2]}代替范围参数扩展
  • @SiegeX 你的方法比我的更好,更易读,我现在会更新答案
猜你喜欢
  • 2011-07-11
  • 1970-01-01
  • 1970-01-01
  • 2020-10-30
  • 2017-11-21
  • 2015-12-04
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多