Perl脚本中执行wget命令无法将响应结果写入文件如何解决
问题根因
wget的--spider模式默认不会下载页面响应体,--output-document参数在该模式下无实际作用。你通过-S参数指定打印的响应头,默认输出到标准错误流(stderr) 而非标准输出流(stdout),你最初的写法将所有输出重定向到/dev/null,自然无内容写入目标文件- 你测试时用到的
1&>是Bash专属的合并重定向语法,而cron调用Perl脚本执行系统命令时,默认使用sh解析命令,sh不支持该语法,导致重定向失效 - 部分环境下cron的PATH变量和交互式登录shell的PATH不同,如果
wget路径不在cron的PATH里也会导致执行异常,可以用which wget拿到全路径(比如/usr/bin/wget)替换命令中的wget做兼容
修复方案
- 优先使用POSIX兼容的重定向写法,适配
sh执行环境,确保响应头正确写入文件:
# 请提前确保${dir}变量已正确赋值,且路径对执行用户有读写权限 system("/usr/bin/wget -S --spider -q -t 1 \"example.com\" > ${dir}status.txt 2>&1");
- 若需要使用Bash专属语法,可以显式指定Bash执行命令:
system("bash -c '/usr/bin/wget -S --spider -q -t 1 \"example.com\" &> ${dir}status.txt'");
内容的提问来源于stack exchange,提问作者StevieD
相关产品推荐
相关产品推荐

