openvpn --errors-to-stderr 是启动选项,不是错误
在命令行里看到 --errors-to-stderr 并不代表出了什么错。先判断你读的是启动行还是进程输出,然后再核查。
包含 --errors-to-stderr 看起来像在报怨,其实并不是 的命令行看起来像在报怨,其实并不是。这个词属于选项名,就像日志文件的名字并不说明文件里有什么。在改动任何配置之前,先弄清楚你实际读到的是什么。
这个判断有三条分支:这一行就是启动命令本身,这一行是程序打印的输出,或者这一行是 VPN 启动前某个包装脚本复述的文本。每条分支指向不同的排查位置,其中只有一条是 VPN 自己的消息。
选项名不是状态消息
对 Community OpenVPN 而言,--errors-to-stderr 把错误输出送到标准错误而不是标准输出。这是对输出流的选择,不是严重级别过滤器,也不会制造错误。之后的 --log 或 --log-append 可以把同样的消息重定向到文件,因此这个标志的效果取决于命令的其余部分。上游的 日志参考文档 规定了这种先后顺序。
所以,标志的存在只说明错误会去哪里。它并不说明已经发生过错误。
启动行还是进程输出
先问是谁打印了这段文本。服务单元、应用包或 shell 包装脚本经常在 VPN 进程写出任何内容之前复述完整的 argv。如果只看到片段,这种复述和状态行无法区分。
如果这一行来自包装脚本,VPN 还没运行,也就没什么可报告的。继续往下看输出,找第一条带时间戳或子系统名的消息。
如果这一行来自 VPN 进程,那它仍然只是调用。OpenVPN 不会把自己的命令行当作错误打印,真正重要的消息在后面。
找到进程及其结果
确认进程是否仍在运行。仍在运行并重试的客户端,与立刻退出的客户端看起来完全不同,而同一行命令都出现在两者前面。
然后通过拥有该进程的组件读取结果。在 systemd 下就是该单元的日志;在桌面应用里就是应用自己的日志或控制台。退出状态加上最后几条消息,才能回答选项名只是暗示的那个问题。
配置解析错误、文件缺失、凭据被拒和对端超时是四种不同的事件。它们走同一条流。它们需要四种不同的修复。动配置文件之前先判断你遇到的是哪一种,求助时引用准确的消息。
这个标志何时才值得保留
当标准输出承载数据、错误不能污染它时,或者当包装脚本分别捕获两个流时,这个标志才值得保留。在终端的前台会话里,两个流都会出现在你眼前。那种情况下,区分它们很少改变你的做法。
如果周围的脚本依赖这种分离,就保留它。仅仅因为名字看着吓人就删掉,只会改变消息出现的位置,别的什么也修不好。
不要改动的部分
不要把这个选项当成修复步骤。删掉它并不能修好证书、路由或认证失败。
如果调用里含有 --config stdin,说明配置是通过标准输入喂进来的。这是关于文件如何提供的另一个决定。一次只改一件事,改第二件之前先重新读一遍实际消息。