我想每天监控启动时间(系统启动所需的时间)与安装的软件版本(内核和其他软件)的比较,以便了解我的 arch-linux 计算机的启动性能。
我使用 systemd 命令systemd-analyze time
来获取启动时间。
我的想法是有一个日志:
[day]
.......Boot time [s]: 2.145 (kernel) + 13.675 (userspace)
.......with kernel version 4.11.2
.......gnome-shell version 3.24.1
[day+1]
.......Boot time [s]: 3.145 (kernel) + 21.665 (userspace)
.......with kernel version 4.17.11
.......gnome-shell version 3.28.3
我能怎么做?
答案1
基本思路
我很想将其作为 systemd 服务来执行此操作,并将其记录到文件中:
$ systemd-analyze time | sed 's/Startup finished in //;s/ +.*(initrd)//;s/ =.*$//'
442ms (kernel) + 10.224s (userspace)
这会将输出减少systemd-analyze time
到您想要的位。您想要的其余信息很容易通过uname
命令gnome-shell
行本身获得:
$ systemd-analyze time | \
sed 's/Startup finished in //;s/ +.*(initrd)//;s/ =.*$//'; \
printf "kernel: %s\ngnome-shell: %s\n" "$(uname -r)" "$(gnome-shell --version)"
442ms (kernel) + 10.224s (userspace)
kernel: 3.10.0-693.21.1.el7.x86_64
gnome-shell: GNOME Shell 3.25.4
更精致
作为上面的脚本:
$ cat ./boottime.bash
#!/bin/bash
printf "[%s]\n" "$(date)"
printf ".......Boot time [s]: %s\n" "$(systemd-analyze time | sed 's/Startup finished in //;s/ +.*(initrd)//;s/ =.*$//')"
printf ".......with kernel version: %s\n" "$(uname -r)"
printf ".......gnome-shell version: %s\n" "$(gnome-shell --version)"
#[day]
#.......Boot time [s]: 2.145 (kernel) + 13.675 (userspace)
#.......with kernel version 4.11.2
#.......gnome-shell version 3.24.1
#[day+1]
#.......Boot time [s]: 3.145 (kernel) + 21.665 (userspace)
#.......with kernel version 4.17.11
#.......gnome-shell version 3.28.3
输出:
$ ./boottime.bash
[Sat Aug 4 14:34:40 EDT 2018]
.......Boot time [s]: 442ms (kernel) + 10.224s (userspace)
.......with kernel version: 3.10.0-693.21.1.el7.x86_64
.......gnome-shell version: GNOME Shell 3.25.4
单元文件:
$ cat /etc/systemd/system/boottime.service
[Unit]
Description=Boottime Service
After=systend-user-sessions.service
[Service]
Type=simple
ExecStart=/opt/bin/boottime.bash
太长了;解析systemd-分析时间
上面使用的工作原理sed
如下:
sed 's/Startup finished in //;s/ +.*(initrd)//;s/ =.*$//')"
s/Startup finished in //
- 删除从左到右的所有内容in
s/ +.*(initrd)//
- 删除从+
以下开始的所有内容(initrd)
s/ =.*$//
- 删除字符串末尾的所有内容,从开始=
到行尾$