📝 原文(日文)发表于 forge.workstyle.tech。
在 macOS 上以 Linux 服务器的思维将推理服务作为后台进程运行,可能会导致一些微妙的问题。例如,“在 Linux 上可行的一行命令在 Mac 上无法工作”,或者“使用 grep 搜索日志会导致乱码错误并崩溃”——这些问题虽然微小,但非常耗时。
本文汇总了在 macOS 上将基于 Seed-VC 的语音转换服务(FastAPI + uvicorn,本地地址为 127.0.0.1:8770)作为后台进程运行时收集的一些简短技巧。重点介绍了以 Linux 为中心的文章中未涵盖的 macOS 特定陷阱。
技巧 1:macOS 上没有 setsid / timeout 命令
首先,重要的是要注意,macOS(基于 BSD)默认不包含 GNU 核心工具集中的 setsid 或 timeout。如果在 Mac 脚本中直接使用这些在 Linux 上用于后台运行和定时执行的命令,你会收到 command not found(命令未找到)错误。
有两种解决方案:
- 通过 Homebrew 安装
coreutils并使用gsetsid/gtimeout - 使用标准工具作为替代方案(见下一个技巧)
对于希望避免外部依赖的后台脚本,使用标准工具作为替代方案是更安全的选择。
技巧 2:使用 nohup + disown 运行后台进程
在没有 setsid 的环境中,nohup 和 disown 的组合可以可靠地保持进程运行,即使在关闭 Shell 之后也是如此。
# 将推理服务作为后台进程运行
nohup bash scripts/start-backend.sh > backend.log 2>&1 &
disown
-
nohup... 忽略挂断信号(SIGHUP),即使终端关闭也能保持进程存活 -
> backend.log 2>&1... 将标准输出和标准错误重定向到日志文件 -
&... 在后台运行进程 -
disown... 从 Shell 的作业表中移除该作业,防止在关闭 Shell 时终止该进程
虽然单独使用 nohup 通常就能保持进程存活,但加上 disown 可以确保关闭终端不会意外终止进程。
技巧 3:tr / grep 处理日志中的二进制数据失败 → 使用 LC_ALL=C
这是 Mac 上最棘手的问题。推理日志可能包含进度条控制字符,或者偶尔出现乱码的多字节序列。当被 macOS 的 tr 或 grep 处理时,你会看到:
tr: Illegal byte sequence(非法字节序列)
发生这种情况是因为区域设置被设为 UTF-8,导致无效字节序列被视为“无效字符”并抛出异常。
解决方案是为这些命令将区域设置设置为 C(按字节序列透传)。
# 从日志中删除不需要的控制字符(避免非法字节序列错误)
LC_ALL=免责声明:本文内容来自互联网,该文观点不代表本站观点。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容,请到页面底部单击反馈,一经查实,本站将立刻删除。