ubuntu20.04 使用shell脚本ps过滤进程判断进程时间比当前系统时间早一小时为真,系统时间为12小时制,考虑跨天问题。列出多种方法并举例说明
时间: 2024-09-20 10:12:32 浏览: 42
ubuntu-desktop-setup:在桌面上安装工作应用程序
在Ubuntu 20.04中,你可以使用bash shell脚本来通过`ps`命令获取并筛选出运行时间比当前系统时间早一小时的进程。由于需要处理12小时制的时间和跨天问题,我们需要结合一些日期和时间计算。以下是几种可能的方法:
1. **利用`date`命令**:
```sh
# 获取当前时间和一天前的时间戳
current_time=$(date +%s)
yesterday_time=$((current_time - (60 * 60 * 24)))
# 使用`ps aux`获取所有进程,并grep筛选出运行时间早于昨天时间的进程
processes=$(ps aux | grep -E '^[^T]*[0-9]{4}:[0-5][0-9](:[0-5][0-9])?$' | awk -F ' ' '{if ($8 + $9 < yesterday_time) print}')
echo "$processes"
```
这里假设`ps`输出的时间格式包含年月日和24小时制小时分钟,`grep`用于匹配这种格式,然后awk计算进程启动时间($8和$9分别代表小时和分钟),如果小于昨天时间则保留。
2. **利用`perl`解析复杂时间格式**:
```sh
perl -e '
use Time::Piece;
my $current = localtime();
my $yesterday = $current - (60 * 60 * 24);
system("ps aux | perl -lane 'print if substr($F[8], 0, length($F[8])-3) <= $yesterday->strftime('%H') && $F[9] <= $yesterday->strftime('%M')'");
'
```
`Time::Piece`模块帮助我们解析和操作时间,这里同样比较进程启动时间是否早于昨天。
3. **直接使用`bc`做数学计算**:
```sh
# 假设进程启动时间保存在第8列(小时)和第9列(分钟)
ps aux | while read line; do
hours_minutes=$(echo "$line" | cut -d' ' -f8-10)
if [[ $(echo "scale=0; $hours_minutes - ($current_hour*60 + $current_minute)" | bc) -lt 0 ]]; then
echo "$line"
fi
done
where `current_hour` 和 `current_minute` 可能需要另外的方式获取当前的小时和分钟。
```
请注意,上述方法可能都需要对`ps`的实际输出做一些调整,因为实际的输出格式可能会因系统配置而异。此外,上述示例假设了系统时间是按照24小时制显示,如果不是,你需要相应地修改时间计算部分。
阅读全文