linux - Bash 脚本调用的已执行程序的跟踪

标签 linux bash scripting

脚本有问题。我需要知道谁调用了那个脚本,谁调用了调用脚本,等等,只需修改行为不当的脚本即可。

这类似于堆栈跟踪,但我对单个 bash 脚本中函数调用的调用堆栈感兴趣。 相反,我需要由我的脚本启动的已执行程序/脚本链。

最佳答案

我前几天写的一个简单的脚本...

# FILE       : sctrace.sh
# LICENSE    : GPL v2.0 (only)
# PURPOSE    : print the recursive callers' list for a script
#              (sort of a process backtrace)
# USAGE      : [in a script] source sctrace.sh
#
# TESTED ON  :
# - Linux, x86 32-bit, Bash 3.2.39(1)-release

# REFERENCES:
# [1]: http://tldp.org/LDP/abs/html/internalvariables.html#PROCCID
# [2]: http://linux.die.net/man/5/proc
# [3]: http://linux.about.com/library/cmd/blcmdl1_tac.htm

#! /bin/bash

TRACE=""
CP=$$ # PID of the script itself [1]

while true # safe because "all starts with init..."
do
        CMDLINE=$(cat /proc/$CP/cmdline)
        PP=$(grep PPid /proc/$CP/status | awk '{ print $2; }') # [2]
        TRACE="$TRACE [$CP]:$CMDLINE\n"
        if [ "$CP" == "1" ]; then # we reach 'init' [PID 1] => backtrace end
                break
        fi
        CP=$PP
done
echo "Backtrace of '$0'"
echo -en "$TRACE" | tac | grep -n ":" # using tac to "print in reverse" [3]

...和一个简单的测试。

test

希望你喜欢。

关于linux - Bash 脚本调用的已执行程序的跟踪,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/685435/

相关文章:

linux - Unix 命令将用户添加到允许 SSH 访问的允许用户列表?

返回 bool 值和消息的 Pythonic 方式

linux - 如何将所有文件而不是目录移动到文件夹中

linux - 是否有更改终端透明度的命令?

bash - 如何通过命令行获取随机的32位十六进制字符串?

linux - 使用 netpipes/netcat 绑定(bind)端口

c - C语言函数如何判断文件是否为elf文件?

java - 将 SHA-512 哈希从 Java 转换为 Bash

linux - 将 .csv 文件从 Linux 发送到 Windows

linux - bash 脚本需要改进循环通过 12 小时前的目录,删除内部的符号链接(symbolic link)并删除目录