返回

Bash 终止进程时错误消息出现的原因及解决方法

Linux

使用 Bash 终止进程时的错误消息

问题

在使用特定的 Bash 函数 killProc 终止进程时,用户可能会遇到以下错误消息:

<path>/bin/killProcs.sh: line 26:  6603 Killed                  taskset -c 39,40 <path> <params> -procname procname1 -p 10001 < /dev/null > ${LOG}/dis_test_nont_$(date +%s).log 2>&1

奇怪的是,此错误消息出现在函数结束后的下一行。

原因分析

仔细检查函数后,发现它使用了 set -x 来启用命令追踪。这会在执行时显示每条命令和其参数。因此,函数外的命令也可能被追踪并显示。

解决方案

要解决此问题,请将 set -x 移出函数,如下所示:

killProc () {
    local PROCNAME="$1"

    echo "$(date) | Attempting to shutdown $PROCNAME ... "

    if [[ -z $(findproc "$PROCNAME") ]]; then
        echo "Process not running ..."
    else
        #search for PID based on process name
        local PROCESS_ID=$( ps -ef -u ${USER} | grep "${APPNAME}" | grep -v grep | grep "procname ${PROCNAME}" | awk '{print $2}')

        #only if this search returns a result do we kill the process
        if [[ "$PROCESS_ID" ]]; then
            kill -9 "$PROCESS_ID"

            #check that process has been killed
            temp_exit=$?

            if [ $temp_exit -eq 0 ]; then
                while kill -0 ${PROCESS_ID} 2>/dev/null; do
                    echo "$(date) | Waiting for process to stop running ... "
                    sleep 2
                done 

                echo "Done"
            else
                echo "Failed"
            fi
        else
            echo "Missing"
        fi
    fi
}

set -x 移出函数后,外部命令不再被追踪,因此不会显示错误消息。

注意事项

启用 set -x 时,它会在输出中打印每条命令和其参数,包括敏感信息(如密码)。因此,在使用 set -x 时要小心,并在完成后及时将其禁用。

常见问题解答

  1. 为什么错误消息会出现在函数结束后的下一行?
    因为 set -x 启用了命令追踪,它会显示每条命令和其参数,包括函数外的命令。

  2. 如何禁用命令追踪?
    使用 set +x 禁用命令追踪。

  3. 什么时候应该启用 set -x
    当需要调试脚本或了解命令是如何执行时。

  4. 为什么 set -x 会在输出中打印敏感信息?
    因为它打印每条命令和其参数,包括敏感信息(如密码)。

  5. 如何避免 set -x 打印敏感信息?
    使用 set -x 时要小心,并在完成后及时将其禁用。还可以使用 printfecho -n 而不是 echo 来打印不带换行符的信息,从而避免 set -x 捕获它。