Linux 系统中的 history 命令堪称运维人员的“命令记忆库”——它会忠实记录你在 bash 中敲下的每一条指令,并保存至 .bash_history 文件。然而,默认情况下 history 只输出命令本身,不会显示每条命令的执行时间。这在排查问题时往往显得不够用:你明明记得昨天执行过某个操作,翻遍历史记录却无法确认具体时间点。
其实 history 内部是保存时间戳的,只是输出时默认隐藏了。它依赖一个名为 HISTTIMEFORMAT 的环境变量,该变量控制时间格式的显示方式。如果变量未设置或为空,系统就会按“简洁”模式处理——仅输出命令,不附带时间。一旦你配置了 HISTTIMEFORMAT,系统会借助 strftime 函数将时间戳格式化为可读字符串。获取时间戳后,结合历史记录回溯问题,排查效率会大幅提升。
具体如何配置?根据你的需求,有三种不同级别的设置方法:临时设置(仅当前会话有效)、永久设置当前用户、永久设置所有用户。无论选择哪种方式,核心都在于为 HISTTIMEFORMAT 指定合适的格式字符串。常用的格式包括:
%T:显示时间(HH:MM:SS)%F:显示日期(YYYY-MM-DD,ISO 8601 标准格式)
举个例子,默认的 history 输出如下:
# history 1 yum install -y mysql-server mysql-client 2 service mysqld start 3 sysdig proc.name=sshd 4 sysdig -c topprocs_net 5 sysdig proc.name=sshd 6 sysdig proc.name=sshd | more 7 sysdig fd.name=/var/log/auth.log | more 8 sysdig fd.name=/var/log/mysqld.log 9 sysdig -cl 10 sysdig -i httplog 11 sysdig -i proc_exec_time 12 sysdig -i topprocs_cpu 13 sysdig -c topprocs_cpu 14 sysdig -c tracers_2_statsd 15 sysdig -c topfiles_bytes 16 sysdig -c topprocs_cpu 17 sysdig -c topprocs_cpu "fd.name contains sshd" 18 sysdig -c topprocs_cpu "proc.name contains sshd" 19 csysdig 20 sysdig -c topprocs_cpu 21 rpm --import https://s3.amazonaws.com/download.draios.com/DRAIOS-GPG-KEY.public 22 curl -s -o /etc/yum.repos.d/draios.repo https://download.draios.com/stable/rpm/draios.repo 23 yum install -y epel-release 24 yum update 25 yum makecache 26 yum -y install kernel-devel-$(uname -r) 27 yum -y install sysdig 28 sysdig 29 yum install httpd mysql 30 service httpd start
一眼看去,全是命令,没有时间。若能在每条记录前加上时间戳,排查问题时就能一目了然。下面分别介绍三种配置方式,每种都很简单,但有一个注意事项:在格式字符串末尾,别忘了在单引号或双引号内加一个空格,否则输出会连在一起,难以阅读。
方法 1:临时设置(当前会话有效)
直接在终端执行 export 命令即可,效果持续到当前 shell 会话结束,关掉终端或重启后失效:
# export HISTTIMEFORMAT='%F %T '
方法 2:永久设置当前用户
将环境变量写入当前用户的 shell 配置文件,例如 .bashrc 或 .bash_profile。执行以下任一命令:
# echo 'HISTTIMEFORMAT="%F %T "' >> ~/.bashrc
或者:
# echo 'HISTTIMEFORMAT="%F %T "' >> ~/.bash_profile
然后立即生效:
# source ~/.bashrc
或:
# source ~/.bash_profile
设置后,该用户每次登录时 history 都会自动显示时间。
方法 3:永久设置所有用户
如果你希望系统上所有用户都使用带时间的 history 输出,可以将变量写入全局配置文件 /etc/profile:
# echo 'HISTTIMEFORMAT="%F %T "' >> /etc/profile
同样需要执行 source 使当前会话生效,或者等用户下次登录时自动加载:
# source /etc/profile
配置完成后,再次运行 history,输出将变成下面这样——每条命令都附带了执行时的精确日期和时间:
# history 1 2017-08-16 15:30:15 yum install -y mysql-server mysql-client 2 2017-08-16 15:30:15 service mysqld start 3 2017-08-16 15:30:15 sysdig proc.name=sshd 4 2017-08-16 15:30:15 sysdig -c topprocs_net 5 2017-08-16 15:30:15 sysdig proc.name=sshd 6 2017-08-16 15:30:15 sysdig proc.name=sshd | more 7 2017-08-16 15:30:15 sysdig fd.name=/var/log/auth.log | more 8 2017-08-16 15:30:15 sysdig fd.name=/var/log/mysqld.log 9 2017-08-16 15:30:15 sysdig -cl 10 2017-08-16 15:30:15 sysdig -i httplog 11 2017-08-16 15:30:15 sysdig -i proc_exec_time 12 2017-08-16 15:30:15 sysdig -i topprocs_cpu 13 2017-08-16 15:30:15 sysdig -c topprocs_cpu 14 2017-08-16 15:30:15 sysdig -c tracers_2_statsd 15 2017-08-16 15:30:15 sysdig -c topfiles_bytes 16 2017-08-16 15:30:15 sysdig -c topprocs_cpu 17 2017-08-16 15:30:15 sysdig -c topprocs_cpu "fd.name contains sshd" 18 2017-08-16 15:30:15 sysdig -c topprocs_cpu "proc.name contains sshd" 19 2017-08-16 15:30:15 csysdig 20 2017-08-16 15:30:15 sysdig -c topprocs_cpu 21 2017-08-16 15:30:15 rpm --import https://s3.amazonaws.com/download.draios.com/DRAIOS-GPG-KEY.public 22 2017-08-16 15:30:15 curl -s -o /etc/yum.repos.d/draios.repo https://download.draios.com/stable/rpm/draios.repo 23 2017-08-16 15:30:15 yum install -y epel-release 24 2017-08-16 15:30:15 yum update 25 2017-08-16 15:30:15 yum makecache 26 2017-08-16 15:30:15 yum -y install kernel-devel-$(uname -r) 27 2017-08-16 15:30:15 yum -y install sysdig 28 2017-08-16 15:30:15 sysdig 29 2017-08-16 15:30:15 yum install httpd mysql 30 2017-08-16 15:30:15 service httpd start
可以看到,每条命令都清晰记录了执行的精确时间。这个小技巧在日常运维和故障排查中非常实用——知道某条命令在何时执行,往往能帮你锁定问题发生的窗口。如果你之前只看命令内容,不妨现在就设置一下,让 history 的输出更完整、更可追溯。
