返回
Bash 终止进程时错误消息出现的原因及解决方法
Linux
2024-03-08 07:47:22
使用 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
时要小心,并在完成后及时将其禁用。
常见问题解答
-
为什么错误消息会出现在函数结束后的下一行?
因为set -x
启用了命令追踪,它会显示每条命令和其参数,包括函数外的命令。 -
如何禁用命令追踪?
使用set +x
禁用命令追踪。 -
什么时候应该启用
set -x
?
当需要调试脚本或了解命令是如何执行时。 -
为什么
set -x
会在输出中打印敏感信息?
因为它打印每条命令和其参数,包括敏感信息(如密码)。 -
如何避免
set -x
打印敏感信息?
使用set -x
时要小心,并在完成后及时将其禁用。还可以使用printf
或echo -n
而不是echo
来打印不带换行符的信息,从而避免set -x
捕获它。