在 cron 中将 wget 输出管道传输到 /dev/null

nul*_*tek 48 linux bash wget

我每 5 分钟在我的 crontab 中运行以下命令以保持 Phusion 乘客的存活。

*/5 * * * * wget mysite.com > /dev/null 2>&1
Run Code Online (Sandbox Code Playgroud)

当我运行它时,它会在站点 url 上执行 wget,将 STDOUT/STDERR 路由到 /dev/null。当我从命令行运行它时,它工作正常并且不会在我的主目录中生成 index.html 文件。

当它从 cron 运行时,它每五分钟创建一个新的 index.html 文件,给我留下大量我不想要的索引文件。

运行 cron 作业时我的语法不正确吗?从命令行它可以正常工作,但从 cron 它在我的主目录中生成一个 index.html 文件。

我确定我犯了一个简单的错误,如果有人能帮忙,我将不胜感激。

kas*_*erd 73

你可以这样做:

*/5 * * * * wget -O /dev/null -o /dev/null example.com
Run Code Online (Sandbox Code Playgroud)

这里-O将下载的文件发送到/dev/null-o记录到/dev/null而不是 stderr。这样根本不需要重定向。

  • 谢谢,这比重定向到 STDERR/STDOUT 更直接。我很感激。 (2认同)

Nac*_*cht 19

您需要实际下载内容还是只收到 200 OK?如果您只需要让服务器处理请求,为什么不简单地使用--spider参数呢?


小智 10

我会使用以下内容:

/5 * * * * wget -O - mysite.com > /dev/null 2>&1
Run Code Online (Sandbox Code Playgroud)

-O -选项确保将获取的内容发送到标准输出。

  • 请注意,`foo > /dev/null 2>&1` 更简洁地写为`foo &> /dev/null`。 (4认同)
  • @amalloy 仅在`bash` 中。在 cron 通常使用的 `sh` 中,与号重定向不起作用。 (3认同)

Vol*_*gel 5

您说您只需要在评论中回复“200 OK”。

这允许解决方案比
wget -O /dev/null -o /dev/null example.com. 这个想法不是以某种方式丢弃输出,而是根本不创建任何输出。

您只需要响应意味着下载到本地文件 index.html 中的数据不需要首先下载。
在 HTTP 协议中,命令“GET”用于下载文档。要以实际下载文档之外的其他方式访问文档,有一个特殊的命令“HEAD”。
使用“GET”执行此任务时,文档将在本地下载并丢弃。使用“HEAD”可以满足您的需求,它首先不会传输文档。根据定义,它将始终返回与 'GET' 相同的结果代码。

使用该方法的语法HEADwget有点奇怪:我们需要使用的选项--spider。在这种情况下,它只是做我们想要的 - 使用“HEAD”而不是“GET”访问 URL。
我们可以使用选项-q(quiet)wget不输出有关其功能的详细信息。

结合这一点,wget既不会向 stderr 输出任何内容,也不会保存文档。

wget -q --spider 'http://example.com/'

退出代码告诉我们请求是否成功:

$ wget -q --spider 'http://example.com/'
$ echo $?
0
$ wget -q --spider 'http://example.com/nonexisting'
$ echo $?                                          
8
Run Code Online (Sandbox Code Playgroud)

对于 中的命令crontab,在两种情况下都没有输出这一事实意味着您可以再次使用没有输出作为错误指示。

您的示例命令将更改为:

*/5 * * * * wget -q --spider mysite.com
Run Code Online (Sandbox Code Playgroud)

这与wget -O /dev/null -o /dev/null example.com. 额外的优点是日志输出和文档输出不会生成,而是在本地生成和丢弃。或者当然最大的区别是避免下载然后丢弃文档,index.html.