这两天在服务器上放置一个超级简单的脚本:定时访问一个网址。话说这个都无需脚本,直接curl
指令+crontab就可以搞定,于是我随手设置上,完工美滋滋。
(图源 :pixabay)
不过我今天登录服务器看了一下日志,我晕,怎么一堆出错信息,然后貌似我被要访问的网站屏蔽IP了,这下就尴尬了。😅
crontab执行次数
仔细看了一下日记,首先可以判断的是,我的crontab
设置出错了。因为我期望是每2小时执行一次,那么按说从晚上到早晨(不超过12个小时),多说有6组输出,可是我看网站给我的错误提示足足几十组。
crontab
我设置过无数次了,脚本也非常简单,怎么就能被错误的执行N多次呢?我研究半天,才发现自己疏忽在哪里,我把定时任务写成类似如下模样:
* */2 * * * /home/test1234/test.sh >>/home/test1234/test.log 2>&1
我期望的是,每两小时执行一次脚本,并把信息写入到test.log,你能发现哪里出错了吗?
想必懂的一下子就可以看出来,我把分钟位也写成了*
。这样这条指令的意义就变成了每隔两小时,每分钟执行一次。我怎么能犯这样的错误呢?我晕,把分钟位改成0
,也就是整体如下的模样:
0 */2 * * * /home/test1234/test.sh >>/home/test1234/test.log 2>&1
这回执行次数应该正常了,这种低级的错误,哎,大概是晚上时候脑子不清醒吧。
curl 静默模式
搞定了crontab
执行次数的问题,我们再来看另外一个问题,我发现log文件中一堆curl下载进度的信息,让我几乎没法正常看日志了,为啥会出现进度信息呢?我单独指令的时候没啥问题啊。
仔细研究了一下,不知道为啥,脚本中的curl
和crontab
中的输出重定向似乎起了一些化学反应😵。
我来做个测试:
curl www.cutehive.com
上述指令输出如下内容:
这是正常的,因为我设置了明文(HTTP)访问重定向到加密(HTTPS)链接上去。
然后我在用如下方式:
curl -o output.txt www.cutehive.com
或者:
curl www.cutehive.com >> output.txt
就会显示如下进度信息,并把正常输出写入到output.txt中:
知道了这个问题所在,解决起来就简单了,比如说我们可以crontab中不加输出重定向;或者将crontab执行时的STDOUT(1)以及STDERR(2)分别写到log以及errror_log中。
但是这两种方法都不优雅,最优雅的方式是给curl
加个-s参数(静默模式),就一切搞定啦,比如上述指令,写成:
curl -s -o output.txt www.cutehive.com
就没有乱七八糟的进度信息啦,清清爽爽,美滋滋。一个教训就是半夜还是不要写程序脚本啥的,不然太容易犯低级错误啦😭