有没有办法跟踪 bash 执行的所有进程

有没有办法跟踪 bash 执行的所有进程

我希望能够统计我通过 bash 运行最多的程序。有没有办法在 bash 中插入某种钩子,以便它记录它执行的所有内容?

请注意,仅查看 bash 历史文件还不够。我可以从历史记录的每一行中打印出第一个标记,但这不会获得管道和进程替换。我想要以下内容:

$ ls /usr/bin/* | fgrep $(echo grep)

记录lsfgrep、 和echo分别运行一次。以及以下内容:

$ for file in /usr/bin/*; do stat $file; echo $file; done

应注意statecho运行。由于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`"

相关内容