我正在尝试解决 FreeBSD 服务器上的一些问题,该服务器间歇性地(随机地)被网络防火墙阻止通过 HTTPS 从网络服务器下载某些文件。为了了解阻塞发生时会发生什么,我需要运行以下 cURL:
curl --interface nic1 --verbose --insecure 'https://speed.hetzner.de/100MB.bin' > /dev/null
然后读取命令的stderr。但是,由于问题发生在无法预料的随机时间,我想每 10 秒运行一次这个curl,并将 stderr 存储在一个文件中,以便我以后可以查看它,我使用以下脚本(名为cURLScript
)来实现此目的:
#!/bin/sh
while true
do
date
echo "================================="
curl --interface nic1 --verbose --insecure 'https://speed.hetzner.de/100MB.bin' > /dev/null 2>&1
echo ""
sleep 10
done
然后我运行脚本:
/bin/sh cURLScript > log &
我希望该log
文件将包含 stderr,但是,它没有;缺少log
stderr:
Svr12loc:service 21] cat log
Thu Mar 24 16:42:34 CET 2022
=================================
Thu Mar 24 16:43:03 CET 2022
=================================
Thu Mar 24 16:43:33 CET 2022
=================================
Thu Mar 24 16:44:02 CET 2022
=================================
Thu Mar 24 16:44:32 CET 2022
=================================
Thu Mar 24 16:45:00 CET 2022
=================================
有人可以建议我在这里做错了什么吗?
答案1
你的问题不清楚。我 猜测你是说
- 您不关心 cURL 的 HTML 输出(您要发送到
HTMLFILE
), - 您关心“详细”消息;
- 详细消息将发送到终端(而不是文件
Log
),并且 - 您希望它们转到
Log
文件(而不是终端)。
在 Unix(以及类 Unix 操作系统,甚至其他一些操作系统)中,程序有两个自动输出流:标准输出(缩写为“stdout”)和标准错误(缩写为“stderr”)。顾名思义,stdout 用于主要输出,stderr 用于错误消息和诊断。默认情况下,这两个都指向终端。当您说 时> HTMLFILE
,您正在将 cURL 的标准输出重定向到HTMLFILE
。但详细消息正在写入 stderr。
您想要的是将 cURL 的 stderr 发送到脚本的 stdout(即文件Log
)。
这在任何源自 Bourne shell 的标准、符合 POSIX 的 shell 中都很容易:
#!/bin/sh 虽然是真的 做 日期 回声“====================================” 卷曲 --interface nic1 --verbose --insecure https://www.20min.ch 2>&1 > HTML页面 回声“” 睡10 完毕
2>&1
正是我上面所说的——将 stderr 重定向到 stdout。
在 C shell 中则比较棘手:
#!/bin/csh 设置 t=`mktemp` 而 ((1)) 日期 回声“====================================” (curl --interface nic1 --verbose --insecure https://www.20min.ch > HTMLPAGE) >&“$t” 猫“$t” 回声“” 睡10 结尾
在 csh 中,>&
表示将 stdout 和 stderr 发送到以下文件。将它们发送到不同的地方(这正是您想要的)很棘手。诀窍是将 stdout 发送到您想要的位置,然后将命令括在括号中,然后>&
在包装的命令上使用。我不知道如何简单地将标准错误发送到标准输出。 (可能有一种方法,我预计会被告知它是什么。)上面,我使用了将 stderr 发送到临时文件的技巧,然后使用 cat
.
我鼓励您在标准 shell 中编写脚本。 C shell 不适合编写脚本。
PS如果您不想保存curl的标准输出,为什么不将其发送到/dev/null
?
答案2
您正在将 的输出发送curl
到文件HTMLPAGE
。这>
是一个重定向运算符,其定义就是为了完成此任务。
如果您希望页面内容包含在脚本输出中(即文件中log
),请不要在调用的行上重定向它curl