我希望能够统计我通过 bash 运行最多的程序。有没有办法在 bash 中插入某种钩子,以便它记录它执行的所有内容?
请注意,仅查看 bash 历史文件还不够。我可以从历史记录的每一行中打印出第一个标记,但这不会获得管道和进程替换。我想要以下内容:
$ ls /usr/bin/* | fgrep $(echo grep)
记录ls
、fgrep
、 和echo
分别运行一次。以及以下内容:
$ for file in /usr/bin/*; do stat $file; echo $file; done
应注意stat
并echo
运行。由于for
是 bash 流程控制语句,因此不会被记录。
是否应该记录 shell 内置函数和函数是有争议的(也许只是记录它们的内容)。在上面的示例中,stat
是否echo
应该记录一次或多次运行循环也存在争议。但我可以以最简单的方式处理输出。
运行 bash-x
显示它确实有一些内部机制来挂钩进程exec
并记录正在发生的事情。还有其他方法可以进去吗?
答案1
作为第一切,
strace -e execve -b execve -f -qqv -e signal='!all' bash
对于非smoketest使用,您必须将stderr重定向到某个记录器管道,或者使用strace的文件在某个糟糕的目录中乱扔垃圾-o
,也许-o ~/commandtraces/$(date +%Y%m%d%H%M%S).$$
要对所有交互式 shell 执行此操作,我认为您需要一个保护变量来.bashrc
避免递归。
答案2
当它是您的本地系统时,并且您非常小心,您可以用包装器替换所有 /usr/bin 文件。
就像是
cp -pr /usr/bin /usr/orgbin
cd /usr/bin
for f in *; do
echo "/usr/orgbin/echo $f used >> /tmp/bin_usage.out" > $f
chmod +x $f
done
首先尝试使用 2 个无辜的程序?
答案3
您可以使用PROMPT_COMMAND
挂钩插入一些内容来记录最后输入的命令。该日志可以在命令的帮助下创建logger
。
就像是export PROMPT_COMMAND="logger `history 1`"