我有一个cronjob从JSON格式的网站获取价格列表并将其复制到正确的文件夹中,它看起来像这样:
curl 'https://somesite.web/api/list.json' > ~/list.json.tmp && cp ~/list.json.tmp /srv/www/list.json > /dev/null
问题是,当cron试图获取列表并获得一个空的JSON文件时,网站出现了几次失败。为了防止将来出现这种情况,有没有办法让cron只复制文件,如果它不是空的(没有cp选项来执行此操作)?或者我应该创建一个脚本来执行此操作并在获取列表后调用脚本?
答案 0 :(得分:2)
也许curl --fail
会达到你想要的效果?从手册页:
-f, - fail
(HTTP)服务器错误无提示失败(根本没有输出)。这主要是为了更好地启用脚本等以更好地处理失败的尝试。在正常情况下,当HTTP服务器无法传递文档时,它会返回一个HTML文档(通常也会描述原因和更多)。此标志将阻止curl输出该值并返回错误22。
这会导致curl以失败代码退出,因此语句中的&&
将不会执行副本。
答案 1 :(得分:1)
curl ... && [ -s ~/list/json.tmp ] && cp ~/list/json.tmp /srv/www/list.json
如果指定的文件存在且不为空,则-s
测试为真。
(顺便说一下,> /dev/null
重定向不是必需的。cp
命令可能会向stderr打印错误消息,但它不应该向stdout打印任何内容,这就是你要重定向的内容。)