gpt4 book ai didi

linux - 将 bash 脚本输出重定向到 syslog 后未打印提示

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:04:15 25 4
gpt4 key购买 nike

我找到了这个 article ,这解释了如何将 bash 脚本的输出重定向到系统日志。这正是我所需要的,但是有一个问题。

#!/bin/bash

# Don't ignore any error and return when first error occurs.
exec 1> >(logger -s -t $(basename $0)) 2>&1
set -e

# a list of command(s) that can fail:
chown -R user1:user1 /tmp/myappData/*
chown -R user1:user1 /tmp/myappTmp/*
chown -R user1:user1 /tmp/myappLog/*
#...

exit 0

当我执行上面的脚本时,发生错误,我看到有时,在执行脚本后提示没有返回。我不明白为什么会这样。除非我按回车键,否则提示不会返回。

我担心如果应用程序使用此脚本,它可能无法返回正确的退出代码。

如果我注释掉“set -e”,则提示符总是在脚本执行后正确返回

所以我的问题是,设置脚本以使其在出错时退出并将相应消息记录到系统日志的正确方法是什么?

感谢您的帮助和建议!

最佳答案

这里的问题是 logger 管道在你的脚本退出后仍在运行,所以一些最后要记录的内容打印 after parent shell 发出了它迅速的。如果向上滚动,您会发现提示隐藏在先前输出的某处。


如果您有一个非常非常非常的新 bash,您可以收集进程替换的 PID,稍后等待

exec {orig_out}>&1 {orig_err}>&2 1> >(logger -s -t "${0##*/}") 2>&1; logger_pid=$!
[[ $logger_pid ]] || { echo "ERROR: Needs a newer bash" >&2; exit 1; }

cleanup() {
exec >&$orig_out 2>&$orig_err
wait "$logger_pid"
}
trap cleanup EXIT

使用较旧的 bash,您可以考虑其他技巧。例如,在 Linux 上,您可以使用 flock 命令尝试在退出之前获取对锁定文件的独占访问权,确保只要记录器运行就持有该锁定:

log_lock=$(mktemp "${TMPDIR:-/tmp}/logger.XXXXXX")
exec >(flock -x "$log_lock" logger -s -t "${0##*/}") 2>&1

cleanup() {
exec >/dev/tty 2>&1 || exec >/dev/null 2>&1
flock -x "$log_lock" true
}
trap cleanup EXIT

关于linux - 将 bash 脚本输出重定向到 syslog 后未打印提示,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50715877/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com