作家Philip G. Ezolt在其作品<
It is better just to record exactly what you typed. You can then reproduce the exact command line for a future test, and when reviewing past results, you can also see exactly what you measured. The Linux command script (described in detail in Chapter 8, “Utility Tools: Performance Tool Helpers”) or “cut and paste” from a terminal is a good way to do this.
我是T型人小付,一位坚持终身学习的互联网从业者。喜欢我的博客欢迎在csdn上关注我,如果有问题欢迎在底下的评论区交流,谢谢。
script
命令用来记录终端的行为及结果,并存储成本地文件,可以直接用编辑器打开进行查看。同时可以记录时间轴信息,利用scriptreplay
命令进行动态查看。
利用script -h
查看其帮助文档,如下
[root@testmachine ~]# script -h
Usage:
script [options] [file]
Options:
-a, --append append the output
-c, --command run command rather than interactive shell
-e, --return return exit code of the child process
-f, --flush run flush after each write
--force use output file even when it is a link
-q, --quiet be quiet
-t, --timing[=] output timing data to stderr (or to FILE)
-V, --version output version information and exit
-h, --help display this help and exit
首先这个命令是可以不接任何参数直接跑的,例如
[root@testmachine ~]# script
Script started, file is typescript
[root@testmachine ~]#
这个时候终端提示我们已经开始记录了,并且记录的内容会存储到当前目录的一个叫做typescript
的文件中。我们尝试敲两个命令试试,发现和正常使用终端没有任何异样
[root@testmachine ~]# script
Script started, file is typescript
[root@testmachine ~]# echo "Life is awesome."
Life is awesome.
[root@testmachine ~]# date
Tue Dec 3 17:56:42 +08 2019
[root@testmachine ~]#
打开另一个终端,发现当前目录下确实有个typescript
文件,创建时间和跑script
的时间吻合,不过大小为0,说明我们的操作并没有被实时记录进去
-rw-r--r-- 1 root root 0 Dec 3 17:52 typescript
然后回到之前的终端跑exit
命令退出记录,这时候终端提示我们记录结束了
[root@testmachine ~]# script
Script started, file is typescript
[root@testmachine ~]# echo "Life is awesome."
Life is awesome.
[root@testmachine ~]# date
Tue Dec 3 17:56:42 +08 2019
[root@testmachine ~]# exit
exit
Script done, file is typescript
[root@testmachine ~]#
再次查看typescript
文件,发现大小变化了,访问时间说明是刚才修改的
-rw-r--r-- 1 root root 385 Dec 3 18:00 typescript
打开看看到底记录了些啥
[root@testmachine ~]# cat typescript
Script started on Tue 03 Dec 2019 05:52:57 PM +08
[root@testmachine ~]# echo "Life is awesome."
Life is awesome.
[root@testmachine ~]# date
Tue Dec 3 17:56:42 +08 2019
[root@testmachine ~]# exit
exit
Script done on Tue 03 Dec 2019 06:00:55 PM +08
[root@testmachine ~]#
发现记录的开始时间,结束时间,以及中间的所有交互情况都被完整地记录了下来。所以这个命令有个很重要的应用场景就是对远程访问用户进行行为监控,在被监控的用户的~/.profile
文件中跑一下这个命令即可,当然我们可以利用参数指定保存的路径。
file
参数[root@testmachine ~]# script script.log
Script started, file is script.log
[root@testmachine ~]#
停止记录后发现效果一样
[root@testmachine ~]# script script.log
Script started, file is script.log
[root@testmachine ~]# date
Tue Dec 3 18:23:33 +08 2019
[root@testmachine ~]# exit
exit
Script done, file is script.log
[root@testmachine ~]#
-rw-r--r-- 1 root root 280 Dec 3 18:23 script.log
-a
参数-a
参数[root@testmachine ~]# script -a script.log
Script started, file is script.log
[root@testmachine ~]# echo "You are beautiful."
You are beautiful.
[root@testmachine ~]# date
Tue Dec 3 18:25:43 +08 2019
[root@testmachine ~]# exit
exit
Script done, file is script.log
[root@testmachine ~]#
打开script.log
文件会发现新的记录是被追加上去的,而不是覆盖
[root@testmachine ~]# cat script.log
Script started on Tue 03 Dec 2019 06:22:02 PM +08
[root@testmachine ~]# date
Tue Dec 3 18:23:33 +08 2019
[root@testmachine ~]# exit
exit
Script done on Tue 03 Dec 2019 06:23:36 PM +08
Script started on Tue 03 Dec 2019 06:25:22 PM +08
[root@testmachine ~]# echo "You are beautiful."
You are beautiful.
[root@testmachine ~]# date
Tue Dec 3 18:25:43 +08 2019
[root@testmachine ~]# exit
exit
Script done on Tue 03 Dec 2019 06:25:45 PM +08
[root@testmachine ~]#
-f
参数[root@testmachine ~]# script -f script_force.log
Script started, file is script_force.log
[root@testmachine ~]#
-rw-r--r-- 1 root root 103 Dec 3 22:27 script_force.log
随着我不停记录,文件也在不停变大
[root@testmachine ~]# script -f script_force.log
Script started, file is script_force.log
[root@testmachine ~]# date
Tue Dec 3 22:29:24 +08 2019
[root@testmachine ~]#
-rw-r--r-- 1 root root 184 Dec 3 22:29 script_force.log
这就引出了script
命令另一个应用场景,就是实时远程监控。一个人跑mkfifo foo; script -f foo
命令,然后另一个人可以通过跑cat foo
去进行实时监控
-q
参数[root@testmachine ~]# script -q script_quiet.log
[root@testmachine ~]# date
Tue Dec 3 22:23:01 +08 2019
[root@testmachine ~]# exit
exit
[root@testmachine ~]#
-c
参数[root@testmachine ~]# script script_command.log -c "date;echo 'I love Linux';uname -a"
Script started, file is script_command.log
Tue Dec 3 22:41:09 +08 2019
I love Linux
Linux testmachine 3.10.0-862.14.4.el7.x86_64 #1 SMP Wed Sep 26 15:12:11 UTC 2018 x86_64 x86_64 x86_64 GNU/Linux
Script done, file is script_command.log
[root@testmachine ~]#
有的时候我们会发现一个命令在终端上跑没有报错,但是放到cron
里面的时候就会出错,就可以在cron
里面用script
去跑这个命令。解决crontab里面的命令报错是这个命令的第三个应用场景
-t
参数script
命令强大的地方。[root@testmachine ~]# script -tscript_time.time script_time.log
Script started, file is script_time.log
[root@testmachine ~]# date
Tue Dec 3 22:45:24 +08 2019
[root@testmachine ~]# uname -a
Linux testmachine 3.10.0-862.14.4.el7.x86_64 #1 SMP Wed Sep 26 15:12:11 UTC 2018 x86_64 x86_64 x86_64 GNU/Linux
[root@testmachine ~]# exit
exit
Script done, file is script_time.log
[root@testmachine ~]#
上面我用script_time.time
文件去存储时序信息,用script_time.log
去存放具体的记录内容。注意这里的-t
和script_time.time
中间没有空格。
回放的时候需要用到scriptreplay
命令
[root@testmachine ~]# scriptreplay -t script_time.time -s script_time.log
之后会像放电影一样将刚才的操作重复一遍,例如下面的gif我在跑完命令后没有任何操作
上面在讲解参数的时候基本将这个命令的使用场景也总结的差不多了
crontab
的报错问题如果你能想到别的使用场景欢迎在下面留言分享给我哈
在排查问题的过程当中有效而完整的记录能帮助我们节省不少时间,强大的script
命令能帮助我们实现这一功能,赶紧去试一试吧。