gpt4 book ai didi

bash - 在 Bash 脚本中使用日志记录

转载 作者:行者123 更新时间:2023-11-29 09:10:41 25 4
gpt4 key购买 nike

我有一个 bash 脚本,我需要从中写入日志。目前我使用像下面这样的 block

#log stop request
{
local now=$(date +"%a %b %d %Y %H:%M:%S")

printf "batch stop request successful. \n"
printf " Time :: %s\n" "$now"
printf " PID of process :: %s\n" ${PID[0]}"
} >> "${mylogfile}"

其中 mylogfile 变量将具有日志文件的名称。

这种方法的问题是,当 2 个或更多实例正在运行时,日志往往会被来自交错的实例的写入搞得一团糟。

请注意,我使用 block 时认为它会导致日志一次性写入文件,从而避免了这个问题。

我已经看到来自 Vivek Gite post 的记录器命令.但问题是它不会写入我可以指定的文件,而是写入/var/log/message。

非常感谢任何帮助。

感谢和问候思比

最佳答案

POSIX(IEEE 标准 1003.1-2001)没有定义并发 write() 的行为系统调用将数据发送到同一个文件,因此您可能会根据您的平台获得不同的结果。您可以尝试将所有 printfs 合并为一个,希望这会起作用,但即使这样做也不能保证它在未来或在不同的平台上会起作用。

您可以将消息发送到第三个进程,而不是使用并发控制和刷新来确保写入顺序,该进程将代表所有进程按顺序将您的日志消息写入一个文件。事实上,这就是 post 中的 loggersyslog 所做的。你引用了。 logger 命令不会将消息发送到 /var/log/messages。它将日志消息发送到 syslog,可以将其配置为将日志消息保存在您喜欢的任何位置。不过,更改此配置通常需要管理权限。

如果你不能或不想使用syslog,你也可以使用netcat作为日志服务器。运行此命令将来自所有脚本的所有传入日志消息多路复用到文件中(此作业应始终在后台运行,您也可以在 screen 中运行它):

nc -luk localhost 9876 > shared_log_file &

(端口 9876 只是一个示例)并以这种方式登录每个脚本:

printf "Log message\n" > /dev/udp/localhost/9876

您还可以使用自定义 UDP 服务器代替 netcat(例如 this one)。

关于bash - 在 Bash 脚本中使用日志记录,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8273089/

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