GNU/Linux >> LINUX-Kenntnisse >  >> Linux

Trace von ausgeführten Programmen, die von einem Bash-Skript aufgerufen werden

Ein einfaches Skript, das ich vor einigen Tagen geschrieben habe...

# 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]

... und ein einfacher Test.

Ich hoffe es gefällt euch.


~$ help caller
caller: caller [EXPR]
    Returns the context of the current subroutine call.

    Without EXPR, returns "$line $filename".  With EXPR,
    returns "$line $subroutine $filename"; this extra information
    can be used to provide a stack trace.

    The value of EXPR indicates how many call frames to go back before the
    current one; the top frame is frame 0.

Sie können den Bash-Debugger http://bashdb.sourceforge.net/

verwenden

Oder, wie in den vorherigen Kommentaren erwähnt, der caller bash eingebaut. Siehe:http://wiki.bash-hackers.org/commands/builtin/caller

i=0; while caller $i ;do ((i++)) ;done

Oder als Bash-Funktion:

dump_stack(){
    local i=0
    local line_no
    local function_name
    local file_name
    while caller $i ;do ((i++)) ;done | while read line_no function_name file_name;do echo -e "\t$file_name:$line_no\t$function_name" ;done >&2
}

Eine andere Möglichkeit besteht darin, die PS4 zu ändern und xtrace zu aktivieren:

PS4='+$(date "+%F %T") ${FUNCNAME[0]}() $BASH_SOURCE:${BASH_LINENO[0]}+ '
set -o xtrace    # Comment this line to disable tracing.

Linux
  1. Wie debuggt man ein Bash-Skript?

  2. Bash Echo Die Befehlszeile wird in der Befehlszeile selbst ausgeführt (nicht in einem Skript)?

  3. Installieren von Programmen aus dem Bash-Skript?

  4. Führen Sie das Bash-Skript von der URL aus

  5. Führen Sie das Bash-Skript als Daemon aus

35 Bash-Skriptbeispiele

So führen Sie ein Bash-Skript aus

Basisname mit Leerzeichen in einem Bash-Skript?

Linux-Bash-Skript zum Extrahieren der IP-Adresse

Negieren Sie die if-Bedingung im Bash-Skript

Führen Sie den Bash-Befehl auf der Jenkins-Pipeline aus